View Full Version : Truyền dữ liệu qua Cổng RS232 theo từng byte
toanhoi
26-02-2011, 03:49 PM
Em chào anh chị. Em đang viết chương trình truyền dữ liệu từ Pic 16f877a lên máy tính qua chuẩn RS232 theo kiểu truyền từng byte một nhueng em không biết làm như thế nào.Em ví dụ Pic em nhân được 5 byte từ bên ngoài và muốn truyền 5 byte đó lên máy tính thì code như thế nào ạ
hein_ts
03-03-2011, 09:20 PM
Printf("%...%...",a,b,c...);
Hôm trước mình giao tiếp với máy tính như vậy đó bạn. Cho mỗi byte vào một biến, nếu không phải truyền ký tự thì phải định dạng khác, ví dụ như số HEX, %u,....
vietdien
04-03-2011, 12:26 AM
vấn đề chính của truyền thông nối tiếp là phân biệt giữa các chuỗi byte với nhau. có một cách khá đơn giản và hiệu quả là dùng một khoảng thời gian để tách từng chuỗi byte.
Vd bạn muốn truyền 5byte 1 lần, với 9k6 thì mất khoảng 5ms, vậy bạn thử cứ 110ms truyền một lần, sẽ có 100ms để phân tách chuỗi byte. đơn giản là bạn cứ nhận được 1byte thì start lại timer, nếu timer out (khoảng 50ms không nhận được byte nào nữa) thì có nghĩa là hết bản tin.
vienhanlam01
04-03-2011, 12:48 AM
bạn có thể truyền theo dạng mã ascii như sau :
#use rs232(baud = 9600 , parity = n, xmit = pin_c6 , rcv = pin_c7 , bits = 9)
int16 giatri ;
#int_rda
void xulyngat()
{
getch() ;
putc(giatri / 1000 + 48) ;
putc(giatri % 1000 / 100 + 48) ;
putc(giatri % 1000 % 100 / 10 + 48) ;
putc(giatri % 1000 % 100 % 10 + 48) ;
}
void main()
{
while(true)
;
}
////////////////hoặc dùng printf("%3u", giatri) ; ////////////////////
dientuvienthong
04-03-2011, 11:01 PM
bạn nào giúp mình thông suốt đoạn code của ban vienhanlam01 với:
bạn có thể truyền theo dạng mã ascii như sau :
#use rs232(baud = 9600 , parity = n, xmit = pin_c6 , rcv = pin_c7 , bits = 9)
int16 giatri ;
#int_rda
void xulyngat()
{
getch() ;
putc(giatri / 1000 + 48) ;
putc(giatri % 1000 / 100 + 48) ;
putc(giatri % 1000 % 100 / 10 + 48) ;
putc(giatri % 1000 % 100 % 10 + 48) ;
}
void main()
{
while(true)
;
}
////////////////hoặc dùng printf("%3u", giatri) ; ////////////////////
arm_cortex01
04-03-2011, 11:23 PM
#use rs232(baud = 9600 , parity = n, xmit = pin_c6 , rcv = pin_c7 , bits = 9) / / khai báo giao tiếp rs232
int16 giatri ;
#int_rda // khai báo ngắt truyền thông
void xulyngat()
{
getch() ;
putc(giatri / 1000 + 48) ; // đẩy phần ngàn lên máy tính
putc(giatri % 1000 / 100 + 48) ; // đẩy phần trăm lên máy tính
putc(giatri % 1000 % 100 / 10 + 48) ; // đẩy phần chục
putc(giatri % 1000 % 100 % 10 + 48) ; // đẩy phần đơn vị _ + 48 là chuyển về ascii
}
void main()
{
while(true)
; // chờ ở đây
}
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.