windows C语言读串口数据

news/2024/11/16 21:54:18/
(1)这种方式真的很奇怪,乍一看咋都不像打开串口的,但是真的可以打开。不过在这段代码里并没有配置串口,所以必须借助串口助手才可以,就是先用串口助手打开串口,然后这段程序才可以正常运行。可能是因为在串口助手里已经配置好了串口。
#include<stdio.h>
#include<windows.h>int main()
{FILE *fp;if ((fp = fopen("com6", "r")) == NULL){printf("cannot open com!\n");}elseprintf("open com successful!\n");char str;while (1){fscanf(fp, "%c", &str);printf("%c ", str);Sleep(100);}return 0;
}

(2)这是可以打开串口并且应该是通用的方法

#include <Windows.h>
#include <stdio.h>HANDLE hCom;int main(void)
{hCom = CreateFile(TEXT("com6"),//COM1口GENERIC_READ, //允许读0, //指定共享属性,由于串口不能共享,所以该参数必须为0NULL,OPEN_EXISTING, //打开而不是创建FILE_ATTRIBUTE_NORMAL, //属性描述,该值为FILE_FLAG_OVERLAPPED,表示使用异步I/O,该参数为0,表示同步I/O操作NULL);if (hCom == INVALID_HANDLE_VALUE){printf("打开COM失败!\n");return FALSE;}else{printf("COM打开成功!\n");}SetupComm(hCom, 1024, 1024); //输入缓冲区和输出缓冲区的大小都是1024/*********************************超时设置**************************************/COMMTIMEOUTS TimeOuts;//设定读超时TimeOuts.ReadIntervalTimeout = MAXDWORD;//读间隔超时TimeOuts.ReadTotalTimeoutMultiplier = 0;//读时间系数TimeOuts.ReadTotalTimeoutConstant = 0;//读时间常量//设定写超时TimeOuts.WriteTotalTimeoutMultiplier = 1;//写时间系数TimeOuts.WriteTotalTimeoutConstant = 1;//写时间常量SetCommTimeouts(hCom, &TimeOuts); //设置超时/*****************************************配置串口***************************/DCB dcb;GetCommState(hCom, &dcb);dcb.BaudRate = 9600; //波特率为9600dcb.ByteSize = 8; //每个字节有8位dcb.Parity = NOPARITY; //无奇偶校验位dcb.StopBits = ONESTOPBIT; //一个停止位SetCommState(hCom, &dcb);DWORD wCount;//实际读取的字节数bool bReadStat;char str[2] = { 0 };while (1){//PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); //清空缓冲区bReadStat = ReadFile(hCom, str, sizeof(str), &wCount, NULL);if (!bReadStat){printf("读串口失败!");return FALSE;}else{//str[1] = '\0';printf("%c\n", str[0]);}Sleep(100);}CloseHandle(hCom);
}


在用readFile和WriteFile读写串口的时候需要考虑超时问题,超时的作用是在指定的时间内没有读入或发送指定数量的字符,ReadFile和WriteFile的操作仍然会结束。要查询当前的超时设置应该调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS

结构,调用SetCommTimeouts可以用某一个COMMTIMEOUTS来设置超时。

读写串口的超时总共有两种,间隔超时和总超时。间隔超时是指读取两个字符之间的延时,总超时是指读写操作总共花费的时间。写操作只支持总超时,读操作两种超时都支持。

typedef struct _COMMTIMEOUTS { 

         DWORD ReadIntervalTimeout; //读间隔超时

         DWORD ReadTotalTimeoutMultiplier; //读时间系数

         DWORD ReadTotalTimeoutConstant; //读时间常量

         DWORD WriteTotalTimeoutMultiplier; // 写时间系数

         DWORD WriteTotalTimeoutConstant; //写时间常量

} COMMTIMEOUTS,*LPCOMMTIMEOUTS; 

COMMTIMEOUTS的成员都以ms为单位。

ReadFile函数的最后一个参数,当是重叠操作时,该参数指向一个OVERLAPPED结构,同步操作时,该参数为NULL。

参考连接:点击打开链接http://blog.csdn.net/l_andy/article/details/51131232



http://www.ppmy.cn/news/560926.html

相关文章

华为2288H V5串口重定向修改为iBMC

问题描述&#xff1a; 华为2288Hv5默认的串口都是显示为系统界面(显示器内容)。 显示一般为下面两种情况&#xff08;服务器暂时没有安装操作系统&#xff09;&#xff1a; 问题解决&#xff1a; 如何把串口修改为显示iBMC呢&#xff1f;可以采用如下方式&#xff1a; ①使用…

Linux C/C++串口读写

1.串口简介 串行通信接口(简称“串口”)是计算机一种常用的接口&#xff0c;因其连接线少、通讯简单的特点而得到广泛使用。常用的串口是 RS-232-C接口(又称EIA RS-232-C)&#xff0c;它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同…

飞思卡尔MC9S12G64串口发送接收驱动

因为之前刚入职&#xff0c;对串口调试不了解&#xff0c;下面整理一下书上的串口程序。 移植性还比较强 使用说明&#xff1a;MC9S12系列的串口有两种查询方式 1》使用中断方式查询 2》在主函数中使用轮询的方式的方法进行查询 这两种方法在下面函数中都有体现&#xff0c;需…

C#读取RS232串口扫描枪

扫描对于工业商业的主要输入设备很常见&#xff0c;与扫描枪的通讯也非常简单。之前看到网上有很多人问&#xff0c;但大多说人没有给出确切的回答&#xff0c;其实也就是源代码啦。 我刚好做了一个项目用到了这种扫描枪&#xff0c;现在把做的步骤和代码上传上来&#xff0c;…

CH340串口驱动(包含各系统平台)

CH340转串口芯片支持的平台驱动齐全&#xff0c;支持 Windows/Linux/Android/MacOS/WinCE 等操作系统。各平台下驱动官网链接和说明如下&#xff0c;各平台的安装与使用问题可参见其他博文。 Windows驱动 下载链接&#xff1a;CH340/CH341 Windows 驱动链接http://www.wch.cn/…

Linux——进程控制:创建、终止、等待、替换

进程创建 fork #include <unistd.h> pid_t fork(void);操作系统做了什么&#xff1f; 调用fork之后&#xff0c;内核的工作&#xff1a; 分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回&#xff0c…

服务器系统怎么打驱动精灵,win7系统如何使用驱动精灵?教你在win7系统使用驱动精灵的方法...

驱动精灵是一款驱动管理软件&#xff0c;功能性非常强&#xff0c;可以帮助用户安装驱动、备份驱动、卸载驱动等等。好多小伙伴在win7系统上安装驱动精灵却不知道如何使用&#xff1f;网上也有很多相关教程&#xff0c;但不够详细&#xff0c;因此&#xff0c;这里系统城小编来…

微波炉控制器的设计(EDA课程设计)

微波炉控制器的设计&#xff08;Quartus 9.1&#xff09; 1.设计一个具有定时和信息显示功能的微波炉控制器。 2.要求改微波炉控制器能够在任意时刻取消当前工作&#xff0c;复位为初始状态。 3.可以根据需要设置烹调时间的长短&#xff0c;系统最长的烹调时间为59分59秒&…