如何用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=1;k<Len;k++)
crc=crc ^ myByte[k]; // CRC运算
if(crc)
{
// crc检查错丢弃
}
Len--;
}
// crc检查正确,发送数据给命令解释类
PostData(myByte,Len);
}
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=1;k<Len;k++)
crc=crc ^ myByte[k]; // CRC运算
if(crc)
{
// crc检查错丢弃
}
Len--;
}
// crc检查正确,发送数据给命令解释类
PostData(myByte,Len);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询