串口通信被定时器干扰的有关问题!请帮忙分析一下!多谢
串口通信被定时器干扰的问题!请帮忙分析一下!谢谢!
我现在程序中有串口通信事件中断方式接收数据,下位机收到命令后就会发数据过来,我的主控板接收下位机的数据完成后会通过发送消息的方式来重新发送命令数据给下位机,这样实现循环发送接收,定时器会定时更新某个显示控件,与串口通信无关!现在的问题是:如果我不打开定时器,串口通信可以一直正常工作,但当我打开定时器以后,串口通信总是不时的出现丢数据的现象,我想问一下,串口通信跟定时器有什么关系,为什么会出现这种干扰现象?
这是串口接收数据程序:
DWORD WINAPI ReadPortThread(LPVOID lpvoid)
{
BOOL fReadState;
DWORD dwCommModemStatus;
DWORD dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
CString strTmp;
CString string;
COMADlg* p=(COMADlg*)lpvoid;//获得窗口的指针
while(hPort!=INVALID_HANDLE_VALUE)
{
WaitCommEvent (hPort, &dwCommModemStatus, 0);
if (dwCommModemStatus & EV_RXCHAR)
{
Sleep(100);
ClearCommError(hPort,&dwErrorFlags,&ComStat);
dwLength=ComStat.cbInQue;
if(dwLength > 0)
{
BYTE* buf=new BYTE[8256];
fReadState=ReadFile(hPort,buf,dwLength,&dwLength,NULL);
if(!fReadState)
{
MessageBox(NULL,TEXT("Error in read from serial port"),TEXT("Read Error"),MB_OK);
}
else
{
for(WORD i=0;i<dwLength;i++)
{
CCD_Data[receive_count+i] = buf[i];
}
receive_count+=dwLength;
if(receive_count>=2047)
{
string.Format (_T("\n%d"),receive_count);
TRACE(string);
if(receive_count==2047
{
}
else if(receive_count>2047)
s2440IOP->rGPBDAT = (s2440IOP->rGPBDAT |0x01);
receive_count = 0;
//PurgeComm(hPort,PURGE_RXCLEAR);
p->SendMessage(WM_RECEIVED);
}
}
delete[] buf;
}
}
GetCommModemStatus (hPort, &dwCommModemStatus);
}
return 0;
}
下面是定时器程序部分:
void COMADlg::OnTimer(UINT nIDEvent)
{
m_data++;
mr_NO2nd = m_data;
mr_NOnd = m_data;
mr_SO2nd = m_data;
SetDlgItemInt(IDC_NDSO2,mr_SO2nd);
SetDlgItemInt(IDC_NDNO2,mr_NO2nd);
SetDlgItemInt(IDC_NDNO,mr_NOnd);
CDialog::OnTimer(nIDEvent);
}
请各位大侠帮帮忙 ,小弟感激不尽!我实在不知道原因!
------解决方案--------------------
按理来说不会有这种问题呀,你试着创建一个线程来代替定时器试一下。
------解决方案--------------------
// 试着将串口超时设置的长一些看看。
------解决方案--------------------
和定时器有啥关系。。。单开定时器,不创建线程,用串口调试工具看看会不会有同样现象
------解决方案--------------------
有关系吗??????
------解决方案--------------------
WINCE是不怎么样,但也不至于串口都不稳定
给你我在EVC上写的串口类
我现在程序中有串口通信事件中断方式接收数据,下位机收到命令后就会发数据过来,我的主控板接收下位机的数据完成后会通过发送消息的方式来重新发送命令数据给下位机,这样实现循环发送接收,定时器会定时更新某个显示控件,与串口通信无关!现在的问题是:如果我不打开定时器,串口通信可以一直正常工作,但当我打开定时器以后,串口通信总是不时的出现丢数据的现象,我想问一下,串口通信跟定时器有什么关系,为什么会出现这种干扰现象?
这是串口接收数据程序:
DWORD WINAPI ReadPortThread(LPVOID lpvoid)
{
BOOL fReadState;
DWORD dwCommModemStatus;
DWORD dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
CString strTmp;
CString string;
COMADlg* p=(COMADlg*)lpvoid;//获得窗口的指针
while(hPort!=INVALID_HANDLE_VALUE)
{
WaitCommEvent (hPort, &dwCommModemStatus, 0);
if (dwCommModemStatus & EV_RXCHAR)
{
Sleep(100);
ClearCommError(hPort,&dwErrorFlags,&ComStat);
dwLength=ComStat.cbInQue;
if(dwLength > 0)
{
BYTE* buf=new BYTE[8256];
fReadState=ReadFile(hPort,buf,dwLength,&dwLength,NULL);
if(!fReadState)
{
MessageBox(NULL,TEXT("Error in read from serial port"),TEXT("Read Error"),MB_OK);
}
else
{
for(WORD i=0;i<dwLength;i++)
{
CCD_Data[receive_count+i] = buf[i];
}
receive_count+=dwLength;
if(receive_count>=2047)
{
string.Format (_T("\n%d"),receive_count);
TRACE(string);
if(receive_count==2047
{
}
else if(receive_count>2047)
s2440IOP->rGPBDAT = (s2440IOP->rGPBDAT |0x01);
receive_count = 0;
//PurgeComm(hPort,PURGE_RXCLEAR);
p->SendMessage(WM_RECEIVED);
}
}
delete[] buf;
}
}
GetCommModemStatus (hPort, &dwCommModemStatus);
}
return 0;
}
下面是定时器程序部分:
void COMADlg::OnTimer(UINT nIDEvent)
{
m_data++;
mr_NO2nd = m_data;
mr_NOnd = m_data;
mr_SO2nd = m_data;
SetDlgItemInt(IDC_NDSO2,mr_SO2nd);
SetDlgItemInt(IDC_NDNO2,mr_NO2nd);
SetDlgItemInt(IDC_NDNO,mr_NOnd);
CDialog::OnTimer(nIDEvent);
}
请各位大侠帮帮忙 ,小弟感激不尽!我实在不知道原因!
------解决方案--------------------
按理来说不会有这种问题呀,你试着创建一个线程来代替定时器试一下。
------解决方案--------------------
// 试着将串口超时设置的长一些看看。
------解决方案--------------------
和定时器有啥关系。。。单开定时器,不创建线程,用串口调试工具看看会不会有同样现象
------解决方案--------------------
有关系吗??????
------解决方案--------------------
WINCE是不怎么样,但也不至于串口都不稳定
给你我在EVC上写的串口类
#ifndef __COMMSERIAL_H__
#define __COMMSERIAL_H__
#include <windows.h>
#define INI_COM _T("COM4:")
#define INI_TIME_OUT 3
class CCommSerial
{
public:
// constructor
CCommSerial(CString sPort = INI_COM,
DWORD dwBaudRate = 115200,
BYTE bDataBits = 8,
BYTE bStopBits = 0,
BYTE bParity = 0,