truyền thông qua cổng COM

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • thanhtung914
    Thành viên mới
    • May 2012
    • 5

    #1

    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!??
  • trimen
    Thành viên tích cực
    • Nov 2009
    • 189

    #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

    • van_kq
      Thành viên chính thức
      • Feb 2010
      • 58

      #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

      • thanhtung914
        Thành viên mới
        • May 2012
        • 5

        #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

        • trimen
          Thành viên tích cực
          • Nov 2009
          • 189

          #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

          • thanhtung914
            Thành viên mới
            • May 2012
            • 5

            #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

            • thanhtung914
              Thành viên mới
              • May 2012
              • 5

              #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

              • trimen
                Thành viên tích cực
                • Nov 2009
                • 189

                #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

                • thanhtung914
                  Thành viên mới
                  • May 2012
                  • 5

                  #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

                  • KnowMore
                    Thành viên tích cực
                    • Jun 2008
                    • 786

                    #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...