Nhận dữ liệu từ PIC lên máy tính thông qua UART

thucmetqua

Trứng gà
Tui đang làm giao tiếp giữa PIC và máy tính thông qua UART, gửi lên Hyper terminal thì đc nhưng gửi lên máy tính thì cứ hay bị mất dữ liệu(giả sử như gửi chuỗi là 0 20 40 thì tới 60 thì nó nhận là 00 hay bị mất rùi nhận bình thường tới 80...) ngoài ra, khi viết ko có delay giữa các lần gửi lên:
while(1)
{
for(max=0;max<=900;max=max+20)
{
printf("%Lu\n\r",max);
}
}
thì nó ko phân biệt đc cái gói nhận 1 dãy lun trong ô text (020406080...).hyper thì bình thường

code C# thì làm như hướng dẫn anh Lee trên diễn dàn. Mong bạn nào bít tại sao giúp với. Thân
 
Code đó hình như dùng lệnh s = Com.ReadExisting(); để đọc dữ liệu từ buffer nhưng không có lệnh xóa buffer sau mổi lần nhận nên nó ra chuỗi liên tục như vậy là phải rồi không có gì sai cả. Hơn nữa việc bạn gửi liên tục mà không xóa buffer sẽ làm tràn buffer! Tốt nhất sau mỗi lần nhận được dữ liệu từ cổng Com hãy xóa buffer bằng lệnh
Com.DiscardInBuffer();
 

thucmetqua

Trứng gà
bạn ơi, nếu tui delay_ms(10); giữa các lần gửi thì ko bị chồng, nhưng đôi khi vẫn bị nhận sai lỗi mà tôi đã nói ở trên bạn có bít tại sao ko, vì lỗi sai này xảy ra rất thường xuyên nhận chừng 3,4 giá trị đúng sẽ có 1 giá trị là 00 hoặc sai(giá trị này thường chớp 1 cái rùi mất dù có delay _1s nhưng nó ko gửi lại giá trị như hyper mà gửi giá trị kế tiếp), và hình như càng lớn càng sai nhìu
Cám ơn bạn trước
 
Trong class SerialPort, Event DataReceive sẽ xảy ra khi số byte nhận được lớn hơn hoặc bằng giá trị ReceivedBytesThreshold (thường thì giá trị này là 1). Còn method ReadExisting thì C# sẽ đọc các byte hiện có trong buffer. Do đó khi xài method này thì không chắc là sẽ đọc được toàn bộ dữ liệu bạn gửi mà chỉ là dữ liệu đã nhận được trong buffer.

Bạn thử sử dụng đoạn code sau thử xem:
try
{
s = Com.ReadTo("\r");
}
catch
{
return;
}
Display(s);
Com.DiscardInBuffer();


Method ReadTo(string value) dùng để đọc buffer cho đến khi có string value, nhằm đảm bảo sẽ nhận đủ dữ liệu ta muốn.
Try-Catch để đảm bảo chương trình không bị treo khi xảy ra lỗi kết nối với COM như: COM chưa được mở hoặc quá thời gian Timeout mà chưa nhận được dữ liệu mong muốn.
 
Top