主题:串口通信 共有43380人关注过本帖 |
---|
xxq2012 |
1楼 |
串口通信 Post By:2012-5-17 9:41:00 [只看该作者]
ClearCommError( lpSerial->m_hSer, &dwReadError, &cmStat );
nWillLen = cmStat.cbInQue; 为什么当串口有数据主动上送时,串口接收线程收到的字节数是128的,而不是8个字节触发的 |
|
单帖管理 | 引用 | 回复 |
lqk |
2楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2012-5-17 13:14:00 [只看该作者]
不太清楚你讲的问题,请描述具体一点。
|
单帖管理 | 引用 | 回复 |
xxq2012 |
3楼 |
Post By:2012-5-17 13:31:00 [只看该作者]
EM9360 串口接收下面终端上送的数据,数据很多,我断点设在nWillLen = cmStat.cbInQue;语句的下一条,监测收到的数据长度,每次收到的nWillLen  =0x00000080,就是数据长度达到了128个字节了,而不是8个字节
|
|
单帖管理 | 引用 | 回复 |
x10 |
4楼 |
Post By:2012-5-17 14:20:00 [只看该作者]
EM9360板上的串口是DMA驱动的,其buffer长度为128字节,所以当连续接收的数据超过128个字节,就会在128字节是产生中断(DMA buffer切换),若发送的字节小于128字节,接收在3个字节长度的时间没有进一步的数据时,会产生超时中断,这时应用程序就会收到不是128字节的数据的。
|
|
单帖管理 | 引用 | 回复 |
xxq2012 |
5楼 |
Post By:2012-5-17 14:26:00 [只看该作者]
去年我调试的时候是收到8个字节就触发了nWillLen =0x00000008,现在是板子改了啊?
|
|
单帖管理 | 引用 | 回复 |
x10 |
6楼 |
Post By:2012-5-17 14:44:00 [只看该作者]
是修改了buffer长度,这样可提高效率,适应更高波特率的应用。这个对你有什么不利的影响吗?
|
|
单帖管理 | 引用 | 回复 |
xxq2012 |
7楼 |
Post By:2012-5-17 14:48:00 [只看该作者]
呵呵,我原来接收数据部分的代码得修改了
|
|
单帖管理 | 引用 | 回复 |
admin |
8楼 |
Post By:2012-5-18 14:50:00 [只看该作者]
串口驱动程序提供的数据是一种流式的数据,应用程序的接收线程需要对原始数据进行格式分析,才能提取出符合应用需要的应用数据包供上层使用。比方应用数据包有n个字节,格式为0x55,0xaa, {真正的数据},chksum。这时接收线程需要识别整个数据结构,并做校验和,这样才能得到可靠的应用数据包。如果用收到n个字节就作为应用数据包,可以但肯定不可靠。因为一旦传送过程出点错,那就会连续好几帧数据的丢失。
|
|
单帖管理 | 引用 | 回复 |
xxq2012 |
9楼 |
Post By:2012-5-30 16:14:00 [只看该作者]
下面设备不停的发送数据上来,完整的数据帧是以3个EB 90为同步字头,帧内包括数据长度字节,数据的提取,处理你们有相关的代码和例程吗,能发给我一份作参考吗,请发送到414595534@QQ.com,谢谢!
|
|
单帖管理 | 引用 | 回复 |
x10 |
10楼 |
Post By:2012-5-31 8:28:00 [只看该作者]
我们没有统一的数据帧提取方法,原则是把接收线程做成一个状态机,根据具体的帧结构会有发现相应的简化算法。
|
|
单帖管理 | 引用 | 回复 |
xxq2012 |
11楼 |
Post By:2012-6-1 15:09:00 [只看该作者]
那恢复成原来8个字节触发的方式行吗?通过烧写内核,发个老版本的内核给我,谢谢
|
|
单帖管理 | 引用 | 回复 |
x10 |
12楼 |
Post By:2012-6-2 19:43:00 [只看该作者]
写解析应当很容易的。就是
switch(state) { case 0:    if(buf[i] == 0xEB)       state = 1:    break; .... } 类似上面的流程。对串口数据通讯的程序,应用数据包的提取应当是最基本的。否则通讯过程肯定是不稳定的,这与8字节buffer还是128字节buffer没关系。 如果一定希望要收8个,自然成组,建议发送8个字节后,停4个字节的时间,再发。这样你肯定就能收到8个字节了。 |
|
单帖管理 | 引用 | 回复 |