用WIN32 API编写串口程序

f889823 2014-07-22 09:37:12
我按照百度文库上的文档一步一步照抄一遍,大概的流程就是
hComm = CreateFile (ComName, //串口号
GENERIC_READ , //只允许读操作
0, //串口不可共享,必须以独占方式打开
NULL, //安全属性为NULL
OPEN_EXISTING, //通讯设备串口已存在
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //异步I/O
NULL); //通讯设备不能用模板打开if (hComm == INVALID_HANDLE_VALUE)
{
CloseHandle(hComm);
printf("打开COM失败!");
}
else
{
printf("打开COM成功!");
/*********设置串口参数***********/
memset(&dcb,0,sizeof(dcb)); //将dcb清零
if(!GetCommState(hComm,&dcb)) //获取串口当前状态
{
printf("打开COM状态失败!");
}
else
{
printf("打开COM状态成功!");
dcb.DCBlength = sizeof(dcb); //设置dcb结构体大小
dcb.BaudRate = BaudRate; //设置波特率
dcb.fBinary = FBinary; //设置二进制
dcb.fParity = FParity; //设置进行奇偶校验
dcb.fOutxCtsFlow = 0; //输出控制时,CTS(clear to send)线上的硬件握手
dcb.fOutxDsrFlow = 0; //输出控制时,DSR(data set ready)线上的硬件握手
dcb.fDtrControl = DTR_CONTROL_DISABLE; //DTR(data terminal ready)控制
dcb.fDsrSensitivity = 0; //DSR灵敏度
dcb.fTXContinueOnXoff = 0; //输入缓冲区已满且以传输XoffChar字符后,XOFF是否继续发送
dcb.fOutX = 0; //是否使用XON/XOFF输出控制
dcb.fInX = FInx; //是否使用XON/XOFF输入控制
dcb.fErrorChar = 0; //是否将奇偶校验错误的字符由ErrorChar代替
dcb.fNull = 0; //是否丢弃null字节
dcb.fRtsControl = RTS_CONTROL_DISABLE; //RTS(request to send)控制
dcb.fAbortOnError = 0; //发生错误时,是否中止读写错误
dcb.fDummy2 = 0; //保留
//dcb.wReserved = 0; //保留,Not currently used
dcb.XonLim = 1024; //设置在XON字符发送之前inbuf中允许的最少字节数
dcb.XoffLim = 1024; //设置在发送XOFF字符之前outbuf中允许的最多字节数
dcb.ByteSize = ByteSize; //设置数据宽度
dcb.Parity = Parity; //设置校验
dcb.StopBits = StopBits; //设置停止位
dcb.XonChar = XonChar; //设置表示XON字符的字符
dcb.XoffChar = XoffChar; //设置表示XOFF字符的字符
dcb.EvtChar = 0; //设置表示event字符的字符
dcb.wReserved1 = 0; //保留
if (!SetCommState(hComm,&dcb))
{
printf("设置串口参数失败!");
}
else
{
printf("设置串口参数成功!");

/********************************/
/*********设置串口超时时间参数***********/
timeouts.ReadIntervalTimeout = ReadIntervalTimeout; //以毫秒为单位,设置读间隔超时
timeouts.ReadTotalTimeoutConstant = 0; //以毫秒为单位,设置读时间常量
timeouts.ReadTotalTimeoutMultiplier = 0; //以毫秒为单位,设置读时间系数,不设置读操作超时
/*****ReadTotalTimeout = ReadTotalTimeOutMultiplier* BytesToRead + ReadTotalTimeoutConstant********/
timeouts.WriteTotalTimeoutConstant = 0; //以毫秒为单位,设置写时间常量
timeouts.WriteTotalTimeoutMultiplier = 0; //以毫秒为单位,设置写时间系数,不设置写操作超时
/*****WriteTotalTimeout = WriteTotalTimeOutMultiplier* BytesToWrite + WriteTotalTimeoutConstant****/
if (!SetCommTimeouts(hComm, &timeouts))
{
printf("设置超时时间失败!");
}
else
{
printf("设置超时时间成功!");
/****************************************/
PurgeComm(hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);//清除串口的所有操作
SetupComm(hComm,1024,1024);
while(1)
{
try
{
/*************************************/
/**************读数据*****************/
while(1)
{
bReadStatus = ClearCommError(hComm, &dwErrorFlags, &ComStat);
if (ComStat.cbInQue == 0) //检查串口接收缓冲区中的数据个数
continue;
dwBytesRead=min(1024,DWORD(ComStat.cbInQue));
//dwBytesRead=1024;
RXBuff=new char[dwBytesRead];
if (bRead)
{
bReadStatus = ReadFile(hComm, //串口句柄
RXBuff, //输入缓冲区
dwBytesRead, //读取指定数量的字符
&dwBytesRead, //指向实际读入的字节数
&Comm_ov); //指向OVERLAPPED结构Comm_ov
if (!bReadStatus) //判断读取串口时间是否出错
{
if( GetLastError() == ERROR_IO_PENDING) //利用GetLastError()分析返回结果
bRead=FALSE;
}
else
{
bRead=TRUE;
}
} //close if (bRead)
if (!bRead)
{
bRead=TRUE;
bReadStatus = GetOverlappedResult(hComm, // 串口句柄
&Comm_ov, // 启动异步通信时指定的Overlapped结构体
&dwBytesRead, // 实际读取的字节数
TRUE); // 等待悬挂的异步通信完成
} //close if (!bRead)


*********************************************
大概就是这样 我连接手机用串口给手机发送AT命令 比如 AT^TMODE=3 这个命令的意思是关机重启,并返回OK 但是我收到的永远都是AT^TMODE=3, 也就是把我输进去的又返回了,要不就是返回16进制数 各位大神们错误出在哪啊?小弟第一次发帖帮帮啊 - -
...全文
141 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2014-07-23
  • 打赏
  • 举报
回复
可以先直接用同步读写的方式操作串口,可以设置接收超时的,你的代码乱了点
mrlgy 2014-07-23
  • 打赏
  • 举报
回复
先用虚拟串口试试,感觉成功了再在硬件上测试

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧