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 
#include 

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;
}

[20170713]

你可能感兴趣的:(windows,串口,多线程)