windows C语言读串口数据

(1)这种方式真的很奇怪,乍一看咋都不像打开串口的,但是真的可以打开。不过在这段代码里并没有配置串口,所以必须借助串口助手才可以,就是先用串口助手打开串口,然后这段程序才可以正常运行。可能是因为在串口助手里已经配置好了串口。
#include<stdio.h>
#include<windows.h>

int main()
{
	FILE *fp;
	if ((fp = fopen("com6", "r")) == NULL)
	{
		printf("cannot open com!\n");
	}
	else
		printf("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, //指定共享属性,由于串口不能共享,所以该参数必须为0
		NULL,
		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; //波特率为9600
	dcb.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


  • 9
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Windows操作系统中使用C语言进行串口编程,可以通过调用操作系统提供的串口API来实现。 首先,我们需要包含<Windows.h>头文件,并定义一个HANDLE类型的变量来表示打开的串口。 然后,通过调用CreateFile函数来打开串口,函数的第一个参数是串口的名称,例如"COM1"表示打开COM1口,第二个参数是希望执行的访问模式,比如GENERIC_READ|GENERIC_WRITE表示可可写,第三个参数是指定共享模式,一般选择0,最后一个参数是一个指向SECURITY_ATTRIBUTES结构的指针,指定串口的安全属性,默认设为NULL即可。如果成功打开串口,CreateFile函数会返回一个有效的句柄,用于后续的操作。 接着,我们可以使用SetCommState函数设置串口的通信参数,例如波特率、数据位、停止位、奇偶校验等。该函数的第一个参数是串口的句柄,第二个参数是指向DCB(Device Control Block)结构的指针,该结构包含了串口的通信参数。 之后,我们可以调用ReadFile和WriteFile函数来进行串口写操作。ReadFile函数用于从串口读取数据,需要传入串口句柄、接收缓冲区和期望读取的字节数。WriteFile函数用于向串口写入数据,需要传入串口句柄、要发送的数据和发送的字节数。 最后,使用CloseHandle函数关闭串口,需要传入串口的句柄。这样就完成了对串口的操作。 需要注意的是,在进行串口编程时,我们还需要处理相关的错误。比如,在打开串口和设置串口参数时,需要检查函数的返回值,以确保操作正确执行。同时,还需要考虑错误处理和异常情况的处理,以保证程序的稳定性和可靠性。 总之,在Windows操作系统中使用C语言进行串口编程,需要调用相应的API函数来打开串口、设置串口参数以及数据。同时,还需要合理处理错误和异常情况,以确保程序的正常运行。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值