关于串口多线程编程的处理?求助

sharus 2011-11-09 02:44:51
我在程序中通过SendThread发送一个命令到硬件,然后将硬件通过串口发来的消息通过一个线程ReceiveThread来接收,将消息封装后放在自己定义的Msg结构的变量里,

以下代码为伪代码

Handle gMsg_setEvent;
MyMsg g_msg;


sendThread()
{
sendCommand();
}
sendCommand()
{
send("A");//发送A命令
resetEvent(gMsg_setEvent);
DWORD dwTimeStart = GetTickCount();
WaitForSingleObject(g_MsgSetEvent, 3100);
if (GetTickCount() - dwTimeStart > 3000)
{
//Time Out;处理
return false;////命令失败
}
else
{
//正确接收
return true;//命令成功
}
return false;//命令失败
}

ReceiveThread()
{
//初始化消息
InitMsg(g_msg);
//接收消息

ReadMsgFromRS232();

......
//然后向g_msg结构里放入接收的消息。
Setmsg(g_msg);
setevent(g_MsgSetEvent);
}


这样子工作基本没有问题,但是我如果发送消息的线程多了,比如
sendThreadA,
sendThreadB,每个线程都发了命令,这样子我接收的回来的消息就乱了。
不知道如何去处理。
...全文
83 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharus 2011-11-10
  • 打赏
  • 举报
回复

CRITICAL_SECTION g_cs;

sendCommand()
{
EnterCriticalSection(&g_cs);
bool bSucSendRecv;
send("A");//发送A命令


resetEvent(gMsg_setEvent);
DWORD dwTimeStart = GetTickCount();
WaitForSingleObject(g_MsgSetEvent, 3100);

if (GetTickCount() - dwTimeStart > 3000)
{
//Time Out;处理
bSucSendRecv = false;
}
else
{
//正确接收
//命令成功
bSucSendRecv = true;
}


LeaveCriticalSection(&g_cs);
return bSucSendRecv;
}


我决定这样做,在发送命令里面在弄个临界区控制。应该不会有问题吧?
用户 昵称 2011-11-10
  • 打赏
  • 举报
回复
你自己维护一个消息队列就行了,如果是一个变量,那自然不能做到多事件同时触发。
oyljerry 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sharus 的回复:]
引用 1 楼 lijianli9 的回复:

ReceiveThread加入线程保护,其实主要就是对你的那个msg做保护。


哥们你说假如临界区吗?临界区在ReceiveThread,不过我试过了,感觉还是很难控制,因为没次sendCommnad之后要出了临界区g_msg才可取到,然后再这一小段时间内g_msg还是也会被其他线程改掉。
[/Quote]
要么就把命令做成串型来控制,发了要收到以后才接收,要么就不要用g_msg,用不同的变量保存不同线程发送的命令结果
sharus 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lijianli9 的回复:]

ReceiveThread加入线程保护,其实主要就是对你的那个msg做保护。
[/Quote]

哥们你说假如临界区吗?临界区在ReceiveThread,不过我试过了,感觉还是很难控制,因为没次sendCommnad之后要出了临界区g_msg才可取到,然后再这一小段时间内g_msg还是也会被其他线程改掉。
lijianli9 2011-11-09
  • 打赏
  • 举报
回复
ReceiveThread加入线程保护,其实主要就是对你的那个msg做保护。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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