windows下串口初步编程(多线程+windows串口)

环境

win10操作系统

编程环境:Eclipse、Cygwin GCC编译器

串口环境:串口调试助手v2.1、 虚拟串口助手(Virtual Serial Port Driver 7.2)

过程

1. 在Eclipse环境下新建一个C++工程,并指定使用Cygwin GCC编译器

2. 新建cpp文件,输入代码

3. 打开虚拟串口助手和串口调试助手,建立串口调试的环境

4. 编译和运行

说明

1. 串口作为一种接口,标准C中均使用fopen函数打开,但是该函数在windows系统下无法操作串口;

2. windows封装了接口操作,使用createfile函数操作;

3. 使用createthread创建两个线程,分别执行串口的读和写操作。

代码

 

#include <windows.h>
#include <stdio.h>
 
HANDLE hCom;//句柄,用于初始化串口
 
DWORD WINAPI ThreadWrite(LPVOID lpParameter)//进程1
{
	char outputData[100]={0x00};//输出数据缓存
 
	if( hCom==INVALID_HANDLE_VALUE )
	{
		puts("打开串口失败");
		return 0;
	}
 
	DWORD strLength = 0;
	while(1)
	{
		for(int i=0;i<100;i++)
		{
			outputData[i]=0;
		}
		fgets(outputData,100,stdin);     // 从控制台输入字符串
		strLength = strlen(outputData);
		printf("string length is %d\n",strLength);              // 打印字符串长度
		WriteFile(	hCom,outputData,strLength,&strLength,NULL); // 串口发送字符串
		fflush(stdout);
		PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);            //清空缓冲区
		Sleep(100);
	}
	return 0;
}
 
DWORD WINAPI ThreadRead(LPVOID lpParameter)
{
	if( hCom==INVALID_HANDLE_VALUE )   //INVALID_HANDLE_VALUE表示出错,会设置GetLastError
	{
		puts("打开串口失败");
		return 0;
	}
 
	char getputData[100]={0x00};//输入数据缓存
 
	// 利用错误信息来获取进入串口缓冲区数据的字节数
	DWORD dwErrors;     // 错误信息
	COMSTAT Rcs;        // COMSTAT结构通信设备的当前信息
	int Len=0;
	DWORD length = 100;               //用来接收读取的字节数
	while(1)
	{
		for(int i=0;i<100;i++)
		{
			getputData[i]=0;
		}
 
		ClearCommError(hCom,
				&dwErrors,
				&Rcs);                                // 获取读缓冲区数据长度
		Len = Rcs.cbInQue;
		ReadFile(hCom,getputData,Len,&length,NULL);   //获取字符串
		PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);  //清空缓冲区
		if(Len>0)
		{
			printf("%s\n",getputData);
			fflush(stdout);
		}
		Sleep(100);
	}
	return 0;
}
 
int main()
{
	// 初始化串口
	hCom = CreateFile(TEXT("COM2"), GENERIC_READ | GENERIC_WRITE , 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
	// 获取和设置串口参数
	DCB myDCB;
	GetCommState(hCom, &myDCB);  // 获取串口参数
	printf("baud rate is %d",(int)myDCB.BaudRate);
	fflush(stdout);
	myDCB.BaudRate = 9600;       // 波特率
	myDCB.Parity  =  NOPARITY;   // 校验位
	myDCB.ByteSize = 8;          // 数据位
	myDCB.StopBits = ONESTOPBIT; // 停止位
	SetCommState(hCom, &myDCB);  // 设置串口参数
 
	// 线程创建
	HANDLE HRead,HWrite;
	HWrite = CreateThread(NULL,0,ThreadWrite,NULL,0,NULL);
	HRead  = CreateThread(NULL,0,ThreadRead,NULL,0,NULL);
 
	while(1){;}
 
	CloseHandle(HRead);
	CloseHandle(HWrite);
 
	return 0;
}

作者原文地址:https://blog.csdn.net/rabbitjerry/article/details/75384688

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值