C/C++ code?
// 1.打开串行通信口,保存串口句柄
hCom=CreateFile(m_sPortParam.port,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,// 使用重叠方式
NULL)
if(hCom==(HANDLE)INVALID_FILE_SIZE)
{
PostMessage(m_pMain->GetSafeHwnd(),WM_COMBACK_MESSAGE,0,SETCOMM_ERROR) // 报告端口打开失败
return
}
if(hCom != INVALID_HANDLE_VALUE)
{
// 设置端口
SetupComm(hCom,OUT_BUFF_SIZE,IN_BUFF_SIZE)
DCB myDCB
GetCommState(hCom, &myDCB)
myDCB.BaudRate=m_sPortParam.baud // 波特率
myDCB.fBinary=TRUE // 通信方式=二进制
myDCB.fParity=m_sPortParam.fparity // 奇偶校验 TRUE=使用,FALSE=不使用
myDCB.Parity=m_sPortParam.parity // 校验方式:0-无 1-奇 2-偶 3-标志 4-空格
myDCB.ByteSize=m_sPortParam.bytesize // 数据位数
myDCB.StopBits=m_sPortParam.stopbits // 停止位数:0-1位 1-1.5位 2-2位
SetCommState(hCom, &myDCB)
}
else
{
// 设置失败
PostMessage(m_pMain->GetSafeHwnd(),WM_COMBACK_MESSAGE,0,SETCOMM_ERROR) // 报告端口打开失败
return
}
C/C++ code?
// 2.发送数据
Wol.hEvent=CreateEvent(NULL,// 创建事件句柄
TRUE,
FALSE,
NULL)
WriteFile(hCom,// 发送数据
&datas,
Len,
NULL,
&Wol)
C/C++ code?
// 读缓冲区并处理收到的数据
if(ReadFile(hCom,
&myByte,
Len,
NULL,
&Rol))
{
// CRC数据校验
crc=myByte[0]
if(m_sPortParam.fparity)
{
for(int k=1k<Lenk++)
crc=crc ^ myByte[k] // CRC运算
if(crc)
{
// crc检查错丢弃
}
Len--
}
// crc检查正确,发送数据给命令解释类
PostData(myByte,Len)
}
最好用线程来接受程序static UINTRevThreadProc2(LPVOID pParam)
{
HANDLEh_gEvent
DWORDdwBytesRead
OVERLAPPEDOverlapped
BOOL bReadStatus = FALSE
dwBytesRead = 0
//MessageBox("abc")
memset(&Overlapped,0,sizeof(OVERLAPPED))
h_gEvent = NULL
h_gEvent = CreateEvent(
NULL,
TRUE,//手工设置事件有无信号
FALSE,//初始化事件为无信号状态
NULL//无名事件对像
)
if(h_gEvent == NULL) return 0
Overlapped.hEvent = h_gEvent//指定一个I/O *** 作完成后触发的事件
BYTE data[COM_BUFSIZE]
ZeroMemory(data,COM_BUFSIZE)
DWORD dwEvtMask=0
GetCommMask(g_pMainDlg->m_Io0.m_hHandle,&dwEvtMask)
dwEvtMask |=EV_RXCHAR
SetCommMask(g_pMainDlg->m_Io0.m_hHandle,dwEvtMask)
while(g_pMainDlg->m_Io0.m_hHandle)
{
WaitCommEvent(g_pMainDlg->m_Io0.m_hHandle,&dwEvtMask,NULL)
if (g_pMainDlg->m_Io0.m_hHandle == INVALID_HANDLE_VALUE)
{
return 0
}
if ((dwEvtMask&EV_RXCHAR) == EV_RXCHAR)
{
COMSTAT ComStat
DWORD dwLength,dwErrorFlags
ClearCommError(g_pMainDlg->m_Io0.m_hHandle, &dwErrorFlags, &ComStat )
dwLength = ComStat.cbInQue //输入缓冲区接收了多少数据?
if (dwLength >0)
{
//AfxMessageBox("RevThreadProc2")
bReadStatus = ReadFile( g_pMainDlg->m_Io0.m_hHandle, data,dwLength, &dwBytesRead, &Overlapped)
if(!bReadStatus)
{
if(GetLastError()==ERROR_IO_PENDING)
{
while(!GetOverlappedResult(g_pMainDlg->m_Io0.m_hHandle,
&Overlapped, &dwBytesRead, TRUE ))
{
if(GetLastError() == ERROR_IO_INCOMPLETE)
continue
}
for(DWORD i = 0i<dwBytesReadi++)
{
g_pMainDlg->m_RevData[rec_pos_lineless] = data[i]
rec_pos_lineless++
}
if (rec_pos_lineless >= 5)
{
SetStudentUpDownFromCom(g_pMainDlg->m_RevData,rec_pos_lineless)
rec_pos_lineless = 0
}
}
}
else
{
for(DWORD i = 0i<dwBytesReadi++)
{
g_pMainDlg->m_RevData[rec_pos_lineless] = data[i]
if (data[i] == 144 || data[i] == 80 ||data[i] == 255)
{
bvn++
}
rec_pos_lineless++
}
if (bvn >= 3)
{
、、、、、、、、处理接受到的数据
bvn =0
rec_pos_lineless = 0
}
}
}
}
}
ExitThread(0)
CloseHandle(h_gEvent)//读取时的OS
return 0
}
这个是我写的一个线程,可以接受的,希望对你有用
没用过OPC,不过如果是界面卡死,你可以用SPY++看看窗口消息,再打断点进入处理函数瞧瞧,看主线程卡在了哪里。另外,你多个线程发送多个消息给主线程,也不知道你主线程接收消息的代码如何处理的。
有没有使用线程互斥。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)