VC2005串口通信遇到的问题
HANDLE hCom; //全局变量,串口句柄
// TODO: Add extra initialization here
hCom=CreateFile(CString("//.///COM14"),//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
//AfxMessageBox("打开COM失败!");
//return FALSE;
}
SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是100
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
char lpOutBuffer[7];
memset(lpOutBuffer,'\0',7); //前7个字节先清零
lpOutBuffer[0]='\x11'; //发送缓冲区的第1个字节为DC1
lpOutBuffer[1]='0'; //第2个字节为字符0(30H)
lpOutBuffer[2]='0'; //第3个字节为字符0(30H)
lpOutBuffer[3]='1'; // 第4个字节为字符1(31H)
lpOutBuffer[4]='0'; //第5个字节为字符0(30H)
lpOutBuffer[5]='1'; //第6个字节为字符1(31H)
lpOutBuffer[6]='\x03'; //第7个字节为字符ETX
//从该段代码可以看出,仪表的通讯地址为001
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
CloseHandle(hCom);
vc2005里面可以调用windowns api的函数CreateFile(),利用这个函数创建串口,利用WriteFile()函数进行发送数据。
遇到问题1:字符串编码问题
CreateFile()函数内部使用了LPCWSTR类型的参数,不能"const char *”转换为“LPCWSTR”。这里是unicode编码的问题。可以用
解决办法1:项目属性页->配置属性->常规->字符集->使用多字节字符集,编译
解决办法2: CString(strname)修改要输入的串口名
解决办法3:包含头文件 #include <afxpriv.h> 1、在HANDLE hFile语句之前加上,USES_CONVERSION//声明标示符 2、调用函数A2W把ascii字符串转换成宽字符串,HANDLE hFile = ::CreateFile(A2W(strname), GENERIC_WRITE | GENERIC_READ, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); .
解决办法4:把CreateFile改成CreateFileA试试
遇到问题2:重定义
HANDLE hCom; //全局变量,串口句柄
这个定义放在了.H文件中说很多文件重定义了,但是放在了CPP文件中错误消失。