学习单片机或者嵌入式编程常常要用到超级终端–串口调试助手,但有时需要我们自己做一个终端,用来当上位机。最近课设要求我们自己写个终端来处理串口信息,于是乎,接触了一些windows的串口API,做出了一个简单的串口调试助手,很简陋~
Windows把串口当作文件处理,这点很重要!
使用串口的基本流程:
1、得到串口的句柄,句柄可以看作一个指针或者是一个实例
2、配置串口,比如收发超时时间、波特率,奇偶校验
3、读写串口
使用CreateFile 函数,有8个参数。
不懂这些函数的使用点这个链接,可以节省你的时间
上面这个链接非常非常重要,是一个大佬的博客
//打开串口 CreateFile函数
hCom = CreateFile("COM3",GENERIC_READ |GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);
if (hCom !=INVALID_HANDLE_VALUE)
{
printf("串口打开成功!\n");
}else
{
printf("串口打开失败!\n");
}
1、设置读写超时等待时间
使用SetCommTimeouts 函数,2个参数。
COMMTIMEOUTS timeouts; //windows.h头文件设置的一种变量类型
//读超时
timeouts.ReadIntervalTimeout = 1000; //读操作时两个字符间的间隔超时
timeouts.ReadTotalTimeoutMultiplier = 500; //读操作在读取每个字符时的超时
timeouts.ReadTotalTimeoutConstant = 5000; //读操作的固定超时
//写超时
timeouts.WriteTotalTimeoutMultiplier = 0; //写操作在写每个字符时的超时
timeouts.WriteTotalTimeoutConstant = 2000; //写操作的固定超时
SetCommTimeouts(hCom,&timeouts);
2、设置输入输出缓存区大小
使用SetupComm函数,2个参数。
//设置输入输出缓冲区大小
SetupComm(hCom,500,500);
3、设置串口波特率、数据位、奇偶校验等属性
使用GetCommState、SetCommState 函数,都是2个参数。
DCB dcb; //库里的一种数据结构类型
if (GetCommState(hCom, &dcb) == 0)
{
return -1;
}
dcb.BaudRate = CBR_115200; //波特率在这修改,值格式:CBR_+数值
dcb.ByteSize = 8; //数据位数
dcb.Parity = NOPARITY; //校验位
dcb.StopBits = ONESTOPBIT; //停止位
if(SetCommState(hCom,&dcb) == 0)
{
return -1;
}
使用ReadFile、WriteFile 函数,都是5个参数。
int i;
int count = 20;//函数要用的众多参数
char rbuf[501] = {0},wbuf[501] = {0};
DWORD rsize = 0,wsize = 0;
ReadFile(hCom,rbuf,count,&rsize,NULL);
//printf("数据值:");
for(i = 0;i < rsize;i++)
{
printf("%c",rbuf[i]);
}
printf("\n");
//WriteFile(rs232_dev.hCom, writeBuf, count, &wsize, NULL);
//写数据操作类比读数据
串口设置:
波特率:115200
数据位:8
校验位:None
停止位:1
流控:无
#include
#include
//*设置超时 GetCommTimeouts/SetCommTimeouts
//*设置缓冲区大小 SetupComm()
//* 设置串口配置信息 GetCommState()和SetCommState()
int setUart(HANDLE hCom)
{
COMMTIMEOUTS timeouts;
DCB dcb;
//读超时
timeouts.ReadIntervalTimeout = 1000; //读操作时两个字符间的间隔超时
timeouts.ReadTotalTimeoutMultiplier = 500; //读操作在读取每个字符时的超时
timeouts.ReadTotalTimeoutConstant = 5000; //读操作的固定超时
//写超时
timeouts.WriteTotalTimeoutMultiplier = 0; //写操作在写每个字符时的超时
timeouts.WriteTotalTimeoutConstant = 2000; //写操作的固定超时
SetCommTimeouts(hCom,&timeouts);
//设置输入输出缓冲区大小
SetupComm(hCom,500,500);
//设置串口参数,如波特率
if (GetCommState(hCom, &dcb) == 0)
{
return -1;
}
dcb.BaudRate = CBR_115200; //波特率
dcb.ByteSize = 8; //数据位数
dcb.Parity = NOPARITY; //校验位
dcb.StopBits = ONESTOPBIT; //停止位
if(SetCommState(hCom,&dcb) == 0)
{
return -1;
}
return 0;
}
int main()
{
int i;
HANDLE hCom;
int count = 20;
char rbuf[501] = {0},wbuf[501] = {0};
DWORD rsize = 0,wsize = 0;
//打开串口 CreateFile函数
hCom = CreateFile("COM3",GENERIC_READ |GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);
if (hCom !=INVALID_HANDLE_VALUE)
{
printf("串口打开成功!\n");
}else
{
printf("串口打开失败!\n");
}
//配置串口
if(setUart(hCom) == -1)
{
if(INVALID_HANDLE_VALUE != hCom)
CloseHandle(hCom); //关闭串口
}
//读写串口
printf("开始读取串口数据\n");
while(1)
{
if(INVALID_HANDLE_VALUE != hCom)
{
ReadFile(hCom,rbuf,count,&rsize,NULL);
//printf("数据值:");
for(i = 0;i < rsize;i++)
{
printf("%c",rbuf[i]);
}
printf("\n");
}
//WriteFile(hCom, wbuf, count, &wsize, NULL);
}
return 0;
}
运行结果(连接的硬件是CC2530):