![]() |
#2
rjsp2016-03-31 10:30
|
编译运行之后显示Createfile成功,接着GetCommState失败,虽然最后把发送的数据打印出来了,但此处出现的串口设置失败的问题还是让我不解。
参考了一个相关问题的解答,“除非你的USB设备被驱动映射为串口,不然这一系列函数都会失败”,我的设备管理器显示如图,所以应该不是转换的问题?
只有本站会员才能查看附件,请 登录
COM口的设置也与代码中串口的设置保持了一致,但是仍然提示GetCommState失败。
只有本站会员才能查看附件,请 登录
请大神支支招!
用到的部分代码如下

/* 串口初始化程序 cominit.c */
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BAUD_RATE 9600
#define pr printf
#define EVENPARITY 2
void serialinit(HANDLE* hcom)
{
COMMTIMEOUTS timeouts; //超时函数设置
COMMCONFIG dcb; //dcb的参数配置
/* 把串口作为文件打开 */
*hcom=CreateFile("COM7", //打开串口1,hcom为串口句柄
GENERIC_READ|GENERIC_WRITE, //允许读写
0, //通讯设备必须以独占方式打开
NULL, //安全属性
OPEN_EXISTING, //通讯设备已存在
0, //异步I/O /*FILE_FLAG_OVERLAPPED*/
NULL);
if(*hcom==(HANDLE)-1) //打开串口失败返回
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
{
pr("serial port does exist.\n");
}
pr("some other error occured, Inform user.\n");
}
else
pr("port open successed!\n");
/* 串口超时结构体设置 */
GetCommTimeouts(*hcom,&timeouts);
//COMMTIMEOUTS timeouts={0};
timeouts.ReadIntervalTimeout=MAXWORD; //接收时两字符之间的最大时延
timeouts.ReadTotalTimeoutMultiplier=0; //指定以毫秒为单位的累积值,用于计算读操作时的超时总数
timeouts.ReadTotalTimeoutConstant=0; //指定以毫秒为单位的常数,用于计算读操作时的超时总数
timeouts.WriteTotalTimeoutMultiplier=0; //计算写操作时的超时总数
timeouts.WriteTotalTimeoutConstant=20; //计算写操作时的超时总数
if(!SetCommTimeouts(*hcom,&timeouts)) //与串口绑定失败返回
{
pr("error setting port state.\n");
}
/* 设置串口各项参数 */
if(!GetCommState(*hcom,&dcb.dcb))
{
pr("error setting serial port state.\n"); //串口绑定失败
}
dcb.dcb.BaudRate=BAUD_RATE; //波特率为9600
dcb.dcb.ByteSize=8; //设置数据位
dcb.dcb.Parity=EVENPARITY; //偶校验 校验方式,值0~4分别对应无校验、奇校验、偶校验、校验置位、校验清零
dcb.dcb.StopBits=1; //一个停止位
dcb.dcb.fBinary=TRUE;
dcb.dcb.fParity=TRUE;
if(!SetCommState(*hcom,&dcb.dcb)) //DCB绑定失败返回
{
pr("串口设置出错!\n");
}
}
/*=======================================*/
/* depthrecv.c */
/* 数据接收程序,调用串口初始化程序 */
/* hcom6对应串口描述符 */
/*=======================================*/
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "cominit.c" /*Andrew modified 1*/
#define size6 30
#define pr printf
char com[7]; //串口接收的数据帧
//char depth_str1={"00000000"}; //截取后的数据帧,初始值为零
//float depth1; //浮点型深度数据
extern void serialinit(HANDLE* hcom); /*Andrew modified 2*/
void main()
{ HANDLE hcom6; /*Andrew modified 3*/
int nwrite;
int inum=0,temp=0;
int depthstate=1;
char *readbuff6; //数据接收缓冲区
char *writebuff6; //数据写入缓冲区
int pos=0;
DWORD dwBytesWritten,dwBytesRead;
serialinit(&hcom6); /*Andrew modified 4*/
/* 设置串口输入输出缓冲区 */
if(!SetupComm(hcom6,1024,1024))
{
pr("设置串口读写缓冲区失败!\n");
}
PurgeComm(hcom6,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
/* 将数据写入缓冲区操作 */
writebuff6=(char *)malloc(size6);
pr("please input your data:");
scanf("%s",writebuff6);
nwrite=0;
for(temp = 0;writebuff6[temp]!='\0';temp++)
{
nwrite++;
}
if(!WriteFile(hcom6,writebuff6,nwrite,&dwBytesWritten,NULL))
{ pr("error writting to output buffer.\n");}
else
pr("written data:%s\n",writebuff6);
system("pause");
/* 从输出缓冲区读数据 */
readbuff6=(char *)malloc(size6);
memset(readbuff6,0,size6); //将缓冲区的前size6个字节用0代替,相当于初始化
if(!ReadFile(hcom6,readbuff6,size6,&dwBytesRead,NULL))
{ pr("error reading from input buffer\n");
}
else
pr("Data read from buffer is:%s\n",readbuff6);
/* 关闭串口 */
CloseHandle(hcom6); //关闭设备句柄
free(readbuff6);
free(writebuff6);
}
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BAUD_RATE 9600
#define pr printf
#define EVENPARITY 2
void serialinit(HANDLE* hcom)
{
COMMTIMEOUTS timeouts; //超时函数设置
COMMCONFIG dcb; //dcb的参数配置
/* 把串口作为文件打开 */
*hcom=CreateFile("COM7", //打开串口1,hcom为串口句柄
GENERIC_READ|GENERIC_WRITE, //允许读写
0, //通讯设备必须以独占方式打开
NULL, //安全属性
OPEN_EXISTING, //通讯设备已存在
0, //异步I/O /*FILE_FLAG_OVERLAPPED*/
NULL);
if(*hcom==(HANDLE)-1) //打开串口失败返回
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
{
pr("serial port does exist.\n");
}
pr("some other error occured, Inform user.\n");
}
else
pr("port open successed!\n");
/* 串口超时结构体设置 */
GetCommTimeouts(*hcom,&timeouts);
//COMMTIMEOUTS timeouts={0};
timeouts.ReadIntervalTimeout=MAXWORD; //接收时两字符之间的最大时延
timeouts.ReadTotalTimeoutMultiplier=0; //指定以毫秒为单位的累积值,用于计算读操作时的超时总数
timeouts.ReadTotalTimeoutConstant=0; //指定以毫秒为单位的常数,用于计算读操作时的超时总数
timeouts.WriteTotalTimeoutMultiplier=0; //计算写操作时的超时总数
timeouts.WriteTotalTimeoutConstant=20; //计算写操作时的超时总数
if(!SetCommTimeouts(*hcom,&timeouts)) //与串口绑定失败返回
{
pr("error setting port state.\n");
}
/* 设置串口各项参数 */
if(!GetCommState(*hcom,&dcb.dcb))
{
pr("error setting serial port state.\n"); //串口绑定失败
}
dcb.dcb.BaudRate=BAUD_RATE; //波特率为9600
dcb.dcb.ByteSize=8; //设置数据位
dcb.dcb.Parity=EVENPARITY; //偶校验 校验方式,值0~4分别对应无校验、奇校验、偶校验、校验置位、校验清零
dcb.dcb.StopBits=1; //一个停止位
dcb.dcb.fBinary=TRUE;
dcb.dcb.fParity=TRUE;
if(!SetCommState(*hcom,&dcb.dcb)) //DCB绑定失败返回
{
pr("串口设置出错!\n");
}
}
/*=======================================*/
/* depthrecv.c */
/* 数据接收程序,调用串口初始化程序 */
/* hcom6对应串口描述符 */
/*=======================================*/
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "cominit.c" /*Andrew modified 1*/
#define size6 30
#define pr printf
char com[7]; //串口接收的数据帧
//char depth_str1={"00000000"}; //截取后的数据帧,初始值为零
//float depth1; //浮点型深度数据
extern void serialinit(HANDLE* hcom); /*Andrew modified 2*/
void main()
{ HANDLE hcom6; /*Andrew modified 3*/
int nwrite;
int inum=0,temp=0;
int depthstate=1;
char *readbuff6; //数据接收缓冲区
char *writebuff6; //数据写入缓冲区
int pos=0;
DWORD dwBytesWritten,dwBytesRead;
serialinit(&hcom6); /*Andrew modified 4*/
/* 设置串口输入输出缓冲区 */
if(!SetupComm(hcom6,1024,1024))
{
pr("设置串口读写缓冲区失败!\n");
}
PurgeComm(hcom6,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
/* 将数据写入缓冲区操作 */
writebuff6=(char *)malloc(size6);
pr("please input your data:");
scanf("%s",writebuff6);
nwrite=0;
for(temp = 0;writebuff6[temp]!='\0';temp++)
{
nwrite++;
}
if(!WriteFile(hcom6,writebuff6,nwrite,&dwBytesWritten,NULL))
{ pr("error writting to output buffer.\n");}
else
pr("written data:%s\n",writebuff6);
system("pause");
/* 从输出缓冲区读数据 */
readbuff6=(char *)malloc(size6);
memset(readbuff6,0,size6); //将缓冲区的前size6个字节用0代替,相当于初始化
if(!ReadFile(hcom6,readbuff6,size6,&dwBytesRead,NULL))
{ pr("error reading from input buffer\n");
}
else
pr("Data read from buffer is:%s\n",readbuff6);
/* 关闭串口 */
CloseHandle(hcom6); //关闭设备句柄
free(readbuff6);
free(writebuff6);
}
[此贴子已经被作者于2016-3-31 11:10编辑过]