Thông báo

Collapse
No announcement yet.

truyền thông qua cổng COM

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • truyền thông qua cổng COM

    Mình đang làm đồ án nhưng gặp rắc rối ở việc truyền và nhận 1 số 10bit qua cổng COM, giao tiếp với Pic 16f877a bạn nào có cách giải quyết xin giúp đỡ mình nhe!??

  • #2
    sao bạn không chia nó thành phần chục và phần đơn vị để truyền, hoặc chia nó thành byte cao và byte thấp để truyền, sau đó PC sẽ xử lí dữ liệu truyền lên

    Comment


    • #3
      trước hết bạn phải truyền, nhận được gói dữ liệu qua cổng COM. Sau đó với số 10 bit thì đơn giản nhất là chia thành bit thấp và bit cao. Quy luật truyền, nhận do bạn tự lựa chọn. Sau đó lại ghép bit thấp, bit cao lại thì sẽ nhận được số đã truyền, nhận
      Rễ của sự học tập thì đắng
      Quả của sự học tập thì ngọt

      Comment


      • #4
        Nguyên văn bởi trimen Xem bài viết
        sao bạn không chia nó thành phần chục và phần đơn vị để truyền, hoặc chia nó thành byte cao và byte thấp để truyền, sau đó PC sẽ xử lí dữ liệu truyền lên
        Mình cũng có nghĩ sẽ tách số 10bit ra, mình chỉ cần truyền số <=500 thôi, mình có viết đoạn code truyền như sau các bạn xem và góp ý cho mình nhe!

        Private Sub cmdsend_Click()
        Dim bytestosend(0 To 2) As Byte
        Dim buffer As Variant
        bytestosend(0) = Val(TXTCAIDAT.Text) \ 100
        bytestosend(1) = (Val(TXTCAIDAT.Text) \ 10) Mod 10
        bytestosend(2) = Val(TXTCAIDAT.Text) Mod 10
        buffer = bytestosend()
        MSComm1.Output = buffer
        End Sub

        Private Sub Form_Load()
        Form1.Caption = "DO AN TOT NGHIEP 2009 - 2012"
        MSComm1.CommPort = 3
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.InBufferSize = 1024
        MSComm1.InputLen = 0
        MSComm1.RThreshold = 1
        MSComm1.SThreshold = 0
        MSComm1.OutBufferSize = 512
        MSComm1.InputMode = comInputModeBinary
        MSComm1.PortOpen = True

        Comment


        • #5
          bạn nhầm khúc này :
          Nguyên văn bởi thanhtung914 Xem bài viết
          bytestosend(0) = Val(TXTCAIDAT.Text) \ 100
          bytestosend(1) = (Val(TXTCAIDAT.Text) \ 10) Mod 10
          bytestosend(2) = Val(TXTCAIDAT.Text) Mod 10
          phải như vầy thì nó mới lấy đúng số hàng chục và hàng đơn vị:
          Nguyên văn bởi thanhtung914 Xem bài viết
          bytestosend(0) = Val(TXTCAIDAT.Text) \ 100
          bytestosend(1) = (Val(TXTCAIDAT.Text) Mod 100) / 10
          bytestosend(2) = (Val(TXTCAIDAT.Text) Mod 100)Mod 10
          hoặc bạn có thể truyền byte cao và byte thấp của số đó vậy bạn chỉ phải truyền 2 byte.Ví dụ:
          bytetosend(0)=(Val(TXTCAIDAT.Text)&(0xf0))>>8 //byte cao
          bytetosend(1)=(Val(TXTCAIDAT.Text))&(0x0f)
          Mình ko rành VB lắm bạn xem rồi sửa lại nha.

          Comment


          • #6
            Nguyên văn bởi trimen Xem bài viết
            bạn nhầm khúc này :

            phải như vầy thì nó mới lấy đúng số hàng chục và hàng đơn vị:

            hoặc bạn có thể truyền byte cao và byte thấp của số đó vậy bạn chỉ phải truyền 2 byte.Ví dụ:
            bytetosend(0)=(Val(TXTCAIDAT.Text)&(0xf0))>>8 //byte cao
            bytetosend(1)=(Val(TXTCAIDAT.Text))&(0x0f)
            Mình ko rành VB lắm bạn xem rồi sửa lại nha.
            Cảm ơn bạn trimen nhiều nhe, mình sẽ kế nối thử xem, nếu có vấn đề khác mình sẽ tham khảo ý kiến của các bạn nữa nha!

            Comment


            • #7
              Bạn trimen ơi làm thế nào PIC nhận được 1 mảng byte từ VB gửi xuống, mình chỉ nhận được 1 byte thôi, mình còn yếu CCS lắm mong các bạn giúp mình với!

              Comment


              • #8
                bạn đưa dữ liệu nhận vào 1 mảng, với 1 biến i khi có dữ liệu đến xảy ra ngắt, khi đó đưa dữ liệu vào phần tử thứ i của mảng và tăng i lên. Sau đó chuơng trình chính chỉ cần truy xuất vào mảng để lấy dữ liệu từ máy tính thôi. Ví dụ như sau:
                int i=0;
                byte buffer[100];
                void nhan(void) interrupt 4 //Chuong trinh con dung ngat noi tiep
                {
                if(RI)
                {
                RI=0;

                buffer[i]=SBUF;
                i=i+1;
                }}

                Comment


                • #9
                  các bạn oi giúp mình vấn đề này nhe!
                  trong ccs mình có đoạn code như sau:

                  doc_adc();
                  tam = read_adc();
                  tam = tam/2.048;
                  tram = tam/100;
                  tram = tram + 48;

                  tam = tam%100;
                  chuc = tam/10;
                  chuc = chuc + 48;
                  donvi = tam%10;
                  donvi = donvi + 48;

                  portb = tram;
                  hienthi();
                  portb = chuc;
                  hienthi();
                  portb = donvi;
                  hienthi(); //hthi LCD

                  giờ mình muốn ghép biến tram,chuc,donvi đưa vào một mảng để gửi lên máy tính (VB6), mình đã truyền từng byte nhưng khi VB6 nhận được thì 3byte bị chồng lên nhau (vd tram=1,chuc=2,donvi=3 thi khi lên VB nó hiển thị ra lable thì 1 chồng lên 2 chồng lên 3 giống mình quét led z đó)
                  đây là code VB6 của mình:

                  Private Sub Form_Load()
                  Form1.Caption = "DO AN TOT NGHIEP 2009 - 2012"
                  MSComm1.CommPort = 6
                  MSComm1.Settings = "9600,n,8,1"
                  MSComm1.InBufferSize = 1024
                  MSComm1.InputLen = 0
                  MSComm1.RThreshold = 3
                  MSComm1.SThreshold = 0
                  MSComm1.OutBufferSize = 512
                  MSComm1.InputMode = comInputModeBinary
                  MSComm1.PortOpen = True
                  End Sub

                  Private Sub MSComm1_OnComm()
                  Dim bytetoread() As Byte
                  Dim buffer2 As Variant
                  If MSComm1.CommEvent = comEvReceive Then
                  buffer2 = MSComm1.Input
                  bytetoread() = buffer2
                  LBLHIENTHI.Caption = Val(bytetoread())
                  End If
                  End Sub

                  Các bạn xem giúp mình nha??!!

                  Comment


                  • #10
                    Số <=500 thì không cần 2 Byte đâu (9-bit đã được 0..511 rồi).
                    Truyền khung 9-bit là ngon lành nhất. Hoặc dùng bit chẵn lẻ làm bit thứ 9 cũng được.

                    Comment

                    Về tác giả

                    Collapse

                    thanhtung914 Tìm hiểu thêm về thanhtung914

                    Bài viết mới nhất

                    Collapse

                    Đang tải...
                    X