PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp cổng COM và LPT

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Giao tiếp cổng COM và LPT RS232, RS485 và LPT là những giao tiếp cơ bản và kinh điển khi mới học về vi điều khiển...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 15-11-2009, 03:55 PM   #1
hvhdtk3
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 11
:
Red face Tách dữ liệu nhận được từ PIC877A lên PC

Các bạn giúp mình với
Mình dùng PIC877A, cứ sau 1 giây thì gửi 1 mảng gồm 11 bytes lên máy tính bằng lệnh sau:
Code CCS:
Code:
//-----------------------------------------------------------------------
   for (i=0;i<=10;i++)
      {
      printf("%u ",send_to_PC[i]);
      }
//-----------------------------------------------------------------------
Trên máy tính, mình đã nhận được đủ 11 bytes này bằng phần mềm Visual Basic:
Code Visual Basic:
Code:
'------------------------------------------------------------------------
Private Sub MSComm1_OnComm()
 Dim Buffer As Variant
 If MSComm1.CommEvent = comEvReceive Then
        Buffer = MSComm1.Input
        data_nhan.Text = data_nhan.Text + Buffer
'------------------------------------------------------------------------
Như vậy, sau mối giây, máy tính lại nhận được 11 bytes.

Làm thế nào để tách các byte trong nhóm 11 bytes? Giữa các nhóm byte với nhau?
Mình đã thử dùng một biến count_byte để đếm số bytes nhận được, nhưng chỉ đúng cho nhóm 11 bytes đầu tiên, còn các nhóm bytes sau thì không đúng.
Các bạn biết nhiều về Visual Basic giúp mình với
Cảm ơn nhiều

thay đổi nội dung bởi: phamminhtuan, 16-11-2009 lúc 10:47 AM. Lý do: Định dạng code
hvhdtk3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2009, 10:54 AM   #2
phamminhtuan
Super Moderator
 
phamminhtuan's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 150
:
Trích:
Nguyên văn bởi hvhdtk3 View Post
Các bạn giúp mình với
Mình dùng PIC877A, cứ sau 1 giây thì gửi 1 mảng gồm 11 bytes lên máy tính bằng lệnh sau:
Code CCS:
Code:
//-----------------------------------------------------------------------
   for (i=0;i<=10;i++)
      {
      printf("%u ",send_to_PC[i]);
      }
//-----------------------------------------------------------------------
Trên máy tính, mình đã nhận được đủ 11 bytes này bằng phần mềm Visual Basic:
Code Visual Basic:
Code:
'------------------------------------------------------------------------
Private Sub MSComm1_OnComm()
 Dim Buffer As Variant
 If MSComm1.CommEvent = comEvReceive Then
        Buffer = MSComm1.Input
        data_nhan.Text = data_nhan.Text + Buffer
'------------------------------------------------------------------------
Như vậy, sau mối giây, máy tính lại nhận được 11 bytes.

Làm thế nào để tách các byte trong nhóm 11 bytes? Giữa các nhóm byte với nhau?
Mình đã thử dùng một biến count_byte để đếm số bytes nhận được, nhưng chỉ đúng cho nhóm 11 bytes đầu tiên, còn các nhóm bytes sau thì không đúng.
Các bạn biết nhiều về Visual Basic giúp mình với
Cảm ơn nhiều
Với đoạn code ở trên, thì mỗi giây bạn nhận được nhiều hơn 11 Byte là chắc chắn, vì mỗi một giá trị trong biến send_to_PC khi được định dạng bởi hàm printf sẽ có thể có 1, 2 hay 3 ký tự ascii, ví dụ, giá trị 0-9 có 1 ký tự ascii, giá trị 10-99 là 2 ký tự ascii và giá trị 100-255 có 3 ký tự ascii - chưa kể mỗi lần bạn gởi bạn còn có thể khoảng trắng phía sau nữa.

Bạn muốn gởi chính xác 11 byte lên máy tính và tách nó ra dễ dàng thì bạn nên tạo một frame, bao gồm 1 byte mở đầu hay 1 byte kết thúc hoặc có thể có 1 byte mở đầu + 1 byte kết thúc ..v.v
phamminhtuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2009, 05:04 PM   #3
dung h
Đệ tử 4 túi
 
Tham gia ngày: May 2009
Bài gửi: 74
:
phạm minh tuấn nói rất đúng bạn nên đóng gói thành 1 farme có byte dầu là byte start,byte 2 là byte chỉ số byte data ,và byte cuoi là byte stop

giao diện vb nhận data bạn có thể nhận bằng phương pháp thăm dò hoặc phương pháp ngắt
nếu bạn sử dụng ngắt bạn đặt MSComm1.Rthreshold = số byte nhận ở bài của bạn ta đặt 11 khi đó cứ khi bộ nhớ đệm nhạn được 11 byte thì sẽ nhảy đến sự kiện ngắt on com

Private Sub MSComm1_OnComm()
dim a[11]
dim i
If MSComm1.CommEvent = comEvReceive Then
a[i]= MSComm1.Input
i++
end sub
khi đó bạn sẽ được 1 mảng dữ liệu nhận về

hoặc bạn có thể sử dụng thăm dò sem bộ nhớ đệm khi nòa nhận đủ 11 byte thì đọc và xóa bộ đệm để nhận gói 11 byte tiếp theo
If MSComm1.InBufferCount >10 Then
a[i] = MSComm1.Input

em nối có chỗ nào không đúng mong các bác chỉ giáo!!!! thankS!
còn bạn hãy thử làm xem nhé
dung h vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2009, 10:45 PM   #4
hvhdtk3
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 11
:
Chưa hiểu lắm

Trích:
Nguyên văn bởi dung h View Post
phạm minh tuấn nói rất đúng bạn nên đóng gói thành 1 farme có byte dầu là byte start,byte 2 là byte chỉ số byte data ,và byte cuoi là byte stop

giao diện vb nhận data bạn có thể nhận bằng phương pháp thăm dò hoặc phương pháp ngắt
nếu bạn sử dụng ngắt bạn đặt MSComm1.Rthreshold = số byte nhận ở bài của bạn ta đặt 11 khi đó cứ khi bộ nhớ đệm nhạn được 11 byte thì sẽ nhảy đến sự kiện ngắt on com

Private Sub MSComm1_OnComm()
dim a[11]
dim i
If MSComm1.CommEvent = comEvReceive Then
a[i]= MSComm1.Input
i++
end sub
khi đó bạn sẽ được 1 mảng dữ liệu nhận về

hoặc bạn có thể sử dụng thăm dò sem bộ nhớ đệm khi nòa nhận đủ 11 byte thì đọc và xóa bộ đệm để nhận gói 11 byte tiếp theo
If MSComm1.InBufferCount >10 Then
a[i] = MSComm1.Input

em nối có chỗ nào không đúng mong các bác chỉ giáo!!!! thankS!
còn bạn hãy thử làm xem nhé
Mình chưa hiễu rõ và không quen truyền kiểu này. Mình hình dung FRAME như sau:
|START|Số byte dữ liệu|...Data...|STOP|
Như vậy thì giá trị byte START, STOP = ??? Có phải giá trị này tự mình quy ước không?
Và có cần chú ý gì khi truyền kiểu này không, bạn dung_h ???????
hvhdtk3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2009, 11:07 PM   #5
dung h
Đệ tử 4 túi
 
Tham gia ngày: May 2009
Bài gửi: 74
:
đúng vậy
nếu bạn o biết trước số byte cần truyền thì cần có 1 byte2 báo số byte truyền cho bên nhận biết để xác định gói nhận được
còn nếu bạn đã biết trước hay định bao nhiêu byte thì chỉ cần
|start|...data...|stop|

byte start,stop là do bạn qui định vd là ký tự nào đó
dung h vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-11-2009, 08:04 PM   #6
hvhdtk3
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 11
:
Thankyou!...........
Để mình thử xem sao!
hvhdtk3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 03:00 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam