最近遇到一个RS485通讯的,其实就是USB转485通讯,接线这里不做过多说明,按照硬件图纸接线就好.
主要讨论软件方面的处理遇到问题,:
1.串口打开模式,是同步还是异步,经过测试同步完全没有问题,异步时候数据发送(也就是writefile()会返回异常,暂时不清楚异步的原因.
2.通讯指令,严格按照说明书上的协议指令操作,比如说一般供应商提供的软件串口DEMO都是以ASC码格式发送指令的,测试都是非常正常的,比如文件头\STX,文件未\ETX,校验数据CRC计算方法怎么计算,一般说明书里都会给出计算例程,这个也不用多说,关键是指令帧格式.

这个明确给出每个指令的格式,占用字节数,一般我们发送都是char p[31],
每一个字符占一位,很多时候发送数据没有响应,就是数据格式不正确,或转换之后占用的字节数不对,导致最终端口没有响应.
打开端口指令
CString strComCode;
strComCode.Format(_T(“COM%d”),strcom);
hCom=CreateFile(strComCode,//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox(L"打开COM失败!");
CloseHandle(hCom);
return
}
SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024
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=7; //每个字节有8位
dcb.Parity=EVENPARITY/*NOPARITY*/; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
写入数据
char writeBuffer[32];
writeBuffer[0]='\x02';**//开始符号**
for (int i=0;i<len-2;i++)//需要发送的数据集合统一整理到此处理
{
writeBuffer[i+1]=keyChar;
keyChar++;
}
writeBuffer[30]=‘\x03’;//结束符号**
char* end1=T2A(str.GetBuffer(0));
writeBuffer[31]=end1*;//校验码**
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,writeBuffer,strlen(writeBuffer),& dwBytesWrite,NULL);
if(!bWriteStat)
{
AfxMessageBox(L"写串口失败!");
}
读取也很那简单
char str[256];
memset(str,'\0',256);
DWORD wCount=256;//读取的字节数
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
if(!bReadStat)
AfxMessageBox(L"读串口失败!");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
到此,基本上我们的功能都可以实现,更具相关指令可以查询,修改其它参数.


1万+

被折叠的 条评论
为什么被折叠?



