如何用MFC使用API函数来做串口通信

如何用MFC使用API函数来做串口通信,第1张

就是要现成的了!比如:

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++看看窗口消息,再打断点进入处理函数瞧瞧,看主线程卡在了哪里。

另外,你多个线程发送多个消息给主线程,也不知道你主线程接收消息的代码如何处理的。

有没有使用线程互斥。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11155497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存