我在基于对话框的一个函数里创建了一个辅助线程,然后想在辅助线程里进行串口通信,在线程响应函数里,我设了一个时钟,用SetTimer作的,然后用处理消息的方法捕捉WM_TIMER消息,一旦捕捉到,就往串口送字符,测试发现串口OnComm函数可以响应,现在发现两个问题,一个是程序在下列代码“//****”处加上这句,加了消息框运行时很多情况下程序运行时没事,偶而也会死,但把消息框去掉,则程序容易死,执行一半旧出现关闭对话框,单步执行发现执行到“//****”这句时每事,在下去旧有问题,这是为什么?还有一个问题是:OnComm函数在静态采集串口是没有什么问题,比如仪表显示“189”,打开串口采集静态值189没有问题,但放到辅助线程里。OnComm函数响应了,但发现采集近来的数是“1”,“8”,“9”,就是每次只能采集到一位。这是为何?以下是辅助线程函数:
UINT Cscxtdlg::ComThreadProc(LPVOID pParam)
{
MSG msg;
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
BOOL bRet;
int count=0;
Cscxtdlg* pointer;
char char1='B';
char char2='\n';
CByteArray array;
array.RemoveAll();
array.SetSize(2);
array.SetAt(0,char1);
array.SetAt(1,char2);
pointer = (Cscxtdlg*)pParam;
if(pParam==NULL)
AfxEndThread(NULL);
UINT htimer=::SetTimer(NULL,1,100,NULL);
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
break;
}
if(msg.message==WM_TIMER)
{
Sleep(100);
count++;//*****
AfxMessageBox("11");
pointer->m_ComPort.SetOutput(COleVariant(array));
if(count>20)
{
CString str;
str.Format("%d",count);
AfxMessageBox(str);
break;
}
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
::KillTimer(NULL,htimer);
return 0;//结束线程
}
UINT Cscxtdlg::ComThreadProc(LPVOID pParam)
{
MSG msg;
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
BOOL bRet;
int count=0;
Cscxtdlg* pointer;
char char1='B';
char char2='\n';
CByteArray array;
array.RemoveAll();
array.SetSize(2);
array.SetAt(0,char1);
array.SetAt(1,char2);
pointer = (Cscxtdlg*)pParam;
if(pParam==NULL)
AfxEndThread(NULL);
UINT htimer=::SetTimer(NULL,1,100,NULL);
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
break;
}
if(msg.message==WM_TIMER)
{
Sleep(100);
count++;//*****
AfxMessageBox("11");
pointer->m_ComPort.SetOutput(COleVariant(array));
if(count>20)
{
CString str;
str.Format("%d",count);
AfxMessageBox(str);
break;
}
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
::KillTimer(NULL,htimer);
return 0;//结束线程
}
定时器和自定义线程不要一起用来处理一个监控;他们之间通讯容易出事;要么多定时器,要么多线程;你的array只有两个元素:
array.SetSize(16);看看收到的值是不是"189"Good Luck
我的array是用来得到一个“B\n"字符串,和实际接收过程没有关系,根据串行通信协议,必须先给串口送这个字符串,串口才能响应往输入缓冲区送数,
但静态采集串口是没有问题,所以也不是OnComm函数中数据处理的问题,是不是串口只往输入缓冲区送了一位数?而且如果我把*****下面这句语句:AfxMessageBox("11");去掉,则程序一运行就死,真搞不懂?
使用 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。
--------------------------------------------------------------------------------XML 文档必须有一个最上层元素。
着是为什么?
使用 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。
--------------------------------------------------------------------------------
XML 文档必须有一个最上层元素。
着是为什么?
{
WaitforSingleObject(hSendMutex,1000); //超时后发送数据
。。 //等待仪器发送数据
Delay() 自已写一个延时的函数,不要用 SLEEP //等待时间和传送的速率,数据量有关
//例如:1200,n,8,1 下发送 58 字节要等 800 ~ 1000 毫秒
//接收数据
...}
对于你的问题,俺只能关注;
俺用TIMER和THREAD混合编程,就出错,以后一直没用;------------------------------------------------
你去 硬件/系统 论坛去问问吧
GOOD LUCK