1.引言
串口通信用mscomm控件在x64平台下报错,只能在Win32平台下工作,所以想着换平台,下载32位的halcon进行安装。安装时,不用卸载64位,安装时提示安装插件,会自动检测到runtimeclass x86,安装好后相当于只是多了一个lib中的x86sse2-win32文件夹
2、应用程序无法正常启动(0xc000007b)
安装好,设置好路径后,编译成功,运行报错。查询后发现这是由于64位系统中,32位halcon库不能正常加载造成的。一般的32位程序都可以在64位系统中运行,halcon库比较特殊。
采用x64平台编译,并使用64位halcon库,可以解决该问题。
3.选择serialport类
于是只能放弃mscomm控件,选择serialport类进行串口通信。
4.代码出错修改
网上下载一个实例,里面打开后得到的是一个控制台程序,在MFC对话框中把源文件和头文件添加进工程,编译时报错,后来把出错代码段进行修改。
bool CSerialPort::InitPort( UINT portNo /*= 1*/,UINT baud /*= CBR_9600*/,char parity /*= 'N'*/,
UINT databits /*= 8*/, UINT stopsbits /*= 1*/,DWORD dwCommEvents /*= EV_RXCHAR*/ )
{
DCB dcb;
if ( bIsSuccess )
{
// 将ANSI字符串转换为UNICODE字符串
//DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, szDCBparam, -1, NULL, 0);
//WCHAR *pwText = new WCHAR[dwNum];
//if (!MultiByteToWideChar (CP_ACP, 0, szDCBparam, -1, pwText, dwNum))
//{
// bIsSuccess = TRUE;
//}
///** 获取当前串口配置参数,并且构造串口DCB参数 */
bIsSuccess = GetCommState(m_hComm, &dcb) && BuildCommDCB(szDCBparam, &dcb);
/** 开启RTS flow控制 */
dcb.fRtsControl = RTS_CONTROL_ENABLE;
/** 释放内存空间 */
//delete [] pwText;
}
}
5.相关代码
首先添加头文件和类定义
#include "serialport.h"
CSerialPort mySerialPort;
初始化串口,发送数据
void IO::OnBnClicked初始化()
{
// TODO: 在此添加控件通知处理程序代码
//unsigned char* pData = "1234567";
if (!mySerialPort.InitPort(3, CBR_9600, 'N', 8U, 1U, EV_RXCHAR)) MessageBox("initPort fail !");
if (!mySerialPort.OpenListenThread()) MessageBox("OpenListenThread fail !");
/*mySerialPort.InitPort(3, CBR_9600, 'N', 8U, 1U, EV_RXCHAR);
mySerialPort.OpenListenThread();*/
unsigned char outString[] = "F88F0280808000002000";
mySerialPort.WriteData(outString, 21);
//mySerialPort.ClosePort();
//mySerialPort.CloseListenTread();
}
void IO::OnBnClicked发送()
{
// TODO: 在此添加控件通知处理程序代码
unsigned char outString[] = "F88F0280808000002000";
mySerialPort.WriteData(outString, 21);
}
6.运行成功
点击发送按钮可以一直发送数据