首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

请问一个串口接收上位机数据的有关问题!

2012-03-12 
请教一个串口接收上位机数据的问题!急!急!急!怎样通过串口接收上位机发送的不定长数据,而且数据量还很大,

请教一个串口接收上位机数据的问题!急!急!急!
怎样通过串口接收上位机发送的不定长数据,而且数据量还很大,自己想不通!请哪位大哥帮帮忙,给点建议也行,谢谢!
像这样的协议:
16H + 17H + 总字符数 + 0X05 +字符1 + 字符2 +……字符N +0X0D + 09H + 09H

100个0X81 + 50个0X38 +2字节后续字节数 + 有效数据信息 + 1字节XOR


[解决办法]
将前一种称为A格式,后一种称为B格式;
1)中断顺序接收串口数据;
2)判断是否符合A格式,是按A处理;否则转3)
3)判断是否符合B格式,是按B处理;否则转4)
4)抛弃无效数据,转1)
[解决办法]
(1) 你说到数据量很大,到底有多大,太大了有问题,如果都超过你的单片机的RAM了很定不行的。一般的单片机只有几百字节到几K的RAM。要接受不定长的数据,你首先必须知道这个不定长数据最长数据是多长,然后定义这样一个数组unsigned char u8RxBuffer[DATA_BYTE_MAX];
如果格式是:
“16H + 17H + 总字符数 + 0X05 +字符1 + 字符2 +……字符N +0X0D + 09H + 09H”
请按照楼上bjtea的做法去做。
 

(2)你的另外一种格式是什么意思?太复杂浪费信息量了。
“100个0X81 + 50个0X38 +2字节后续字节数 + 有效数据信息 + 1字节XOR”


[解决办法]
funb楼主自己写吧,就是弄个counter去记你连续收到的0x81,0x38的个数,看是不是100个和50个,不用全存下来解析,收一个解析一个,解析一个就丢一个。 除非有应用数据,否则这样的解析方法下,你只需要一个uchar缓存当前字节就可以了


顺便说下,我的程序里面的get_ch()作用是获取一个串口字节,如果没有收到则返回-1, 程序里wbyte应该是int类型,顺手打的时候打成uchar了
wait_ch()的作用是必须收到一个字节才会返回,内部实际是一个
while((wbyte=get_ch())<0)
的循环

热点排行