完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
学习单片机或者嵌入式编程常常要用到超级终端–串口调试助手,但有时需要我们自己做一个终端,用来当上位机。最近课设要求我们自己写个终端来处理串口信息,于是乎,接触了一些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); 1 2 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); } 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); } printf("n"); } //WriteFile(hCom, wbuf, count, &wsize, NULL); } return 0; } 运行结果(连接的硬件是CC2530): |
|
|
|
只有小组成员才能发言,加入小组>>
2545 浏览 0 评论
1140浏览 2评论
737浏览 1评论
492浏览 0评论
254浏览 0评论
407浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-16 00:39 , Processed in 1.252845 second(s), Total 50, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号