串口接收数据问题,大神帮帮忙

njgcjjw 2012-03-28 02:05:28
老师让写串口接收程序,我使用了CSerialPort类编写,每当串口收到数据,就会触发消息响应WM_RXCHAR,调用处理函数OnRece来讲数据存入缓存数组中,比如说BuffData【】,设置一个定时器,比如每个50ms,调用OnTimer,处理接收到的数据。
现在的情况是,运行程序,会无端终止。
我现在认为是:由于数据是不断输入,而50ms又要调用OnTimer,两个函数都要访问BuffData数组,两者会发生冲突。本来想用多线程管理他们对BuffData的访问,可是他们一个是我自己定义的消息响应函数,一个是系统的消息响应函数。
我这么认为对吗??
该怎么做呢??
希望各位大神不吝赐教
...全文
167 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdg3707 2012-03-28
  • 打赏
  • 举报
回复
用MSCOMM32控件吧:
void CMy72V300AView::OnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
long i = 0,len;
switch (m_Comm1.get_CommEvent())
{
case 2:
//表示接收缓冲区内有字符
{

variant_inp = m_Comm1.get_Input();
safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize();
for (i = 0; i < len; i++)
{
safearray_inp.GetElement(&i, &m_ReceBuff[i]);
}
m_Comm1.put_OutBufferCount(0);// '清空发送缓冲区
m_Comm1.put_InBufferCount(0);// '滑空接收缓冲区
safearray_inp.Clear();
}
break;
default:
break;
}
}
串口初始化:
view1->m_Comm1.put_CommPort(1); //串口1
view1->m_Comm1.put_InBufferSize(4096); //设置输入缓冲区的大小,Bytes
view1->m_Comm1.put_OutBufferSize(2048); //设置输入缓冲区的大小,Bytes
if(!view1->m_Comm1.get_PortOpen()) //打开串口
{
view1->m_Comm1.put_PortOpen(true);
}
view1->m_Comm1.put_OutBufferCount(0);// '清空发送缓冲区
view1->m_Comm1.put_InBufferCount(0);// '滑空接收缓冲区

view1->m_Comm1.put_InputMode(1); //设置输入方式为二进制方式
view1->m_Comm1.put_Settings(str); //设置波特率等参数
view1->m_Comm1.put_RThreshold(8); //为8表示有8个字符即引发事件
view1->m_Comm1.put_InputLen(0);
看看我回复的贴子:
http://topic.csdn.net/u/20120312/10/047409be-ae49-4061-9a4e-e4338935c008.html
三条猫 2012-03-28
  • 打赏
  • 举报
回复
让写线程一直往写缓冲区里面循环写,然后再自己维持一个缓冲区从写缓冲区里读取一定长度的数据,然后对数据按通讯协议进行校验后分析,如果还剩半截数据就继续留在缓冲区里,等待下次读取的数据合并之后再解析。
xiaohuh421 2012-03-28
  • 打赏
  • 举报
回复
最好还是自己使用CreatFile,WriteFile,ReadFile实现串口通信吧.这样一切尽在掌握中啊.
挺前辈们说的,微软的CSerialPort类是有问题的,用起来容易出现莫名其妙的错误.
zhjianjun 2012-03-28
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20120317/13/28937e74-bc22-4ea8-ab06-1421c029dd2f.html
njgcjjw 2012-03-28
  • 打赏
  • 举报
回复
我是在每次接收到数据就将其存入数组中。我可以修改CSerialPort中的响应设置,比如接收N个字符在触发消息。
可是我需要调用OnTimer函数,访问缓存数组,而这时,Receive函数可能会将接收到的数据存入数组中,造成他们同时访问同一资源。
这是我个人认为的,还不确定错误的真实来源
Tinary3v0 2012-03-28
  • 打赏
  • 举报
回复
我也和CSerialPort刚刚进行了一段时间和你一样的斗争,最后我放弃了,选择了其他的串口类。
CSerialPort的确是比较好用的,但是也得分情况。
CSerialPort的最大问题就是太“灵敏”,每次接受到一个char就发送消息了。而我们往往习惯了,发送10个对端接受10个的方式。

出现程序退出,可能是因为你在接受过程中,本来想接受10个进入下一步,结果只接受了1个或者2个或者4个就进入了下一步,造成你程序内部出现问题。
串口在接收的时候可以设定一个多少字节接收到后再发送Recieve消息,参考是MSCOMM和cnComm.h(PUDN上的),MSCOMM叫做SetThreshHold(); cnComm中叫SetNotifyNm();
你到PUDN上去下载一个cnComm.h文件看看吧。

设定了NotifyNm有时候也不行,如果连续发送,还需要中间使用Sleep();暂停一会再发第二组数据。
先写到这。

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧