C语言写个简单的串口调试助手

学习单片机或者嵌入式编程常常要用到超级终端–串口调试助手,但有时需要我们自己做一个终端,用来当上位机。最近课设要求我们自己写个终端来处理串口信息,于是乎,接触了一些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); 

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[i]);
		}
		printf("\n");
		//WriteFile(rs232_dev.hCom, writeBuf, count, &wsize, NULL);
		//写数据操作类比读数据

总代码,直接粘贴就能用

串口设置:
波特率:115200
数据位:8
校验位:None
停止位:1
流控:无

#include<stdio.h>
#include<windows.h>

//*设置超时  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[i]);
			}
			printf("\n");
		} 
		//WriteFile(hCom, wbuf, count, &wsize, NULL);
		 
	 } 
	return 0;
 } 

运行结果(连接的硬件是CC2530):

在这里插入图片描述

  • 24
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
抱歉,我是一名语言模型AI,无法编写和运行代码。以下是C语言串口调试助手的参考代码,希望对您有帮助。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> #define SERIAL_PORT "/dev/ttyUSB0" // 串口设备文件名 #define BAUD_RATE B9600 // 波特率 int main(int argc, char** argv) { int fd; // 文件描述符 struct termios options; // 串口配置选项 char str[512]; // 读取数据缓冲区 // 打开串口设备 fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("open"); return 1; } // 设置串口配置选项 tcgetattr(fd, &options); cfsetispeed(&options, BAUD_RATE); cfsetospeed(&options, BAUD_RATE); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_iflag &= ~(IXON | IXOFF | IXANY); options.c_oflag &= ~OPOST; options.c_cc[VMIN] = 1; options.c_cc[VTIME] = 0; tcsetattr(fd, TCSANOW, &options); // 循环读取串口数据 while (1) { int n = read(fd, str, sizeof(str)); if (n == -1) { perror("read"); break; } else if (n == 0) { usleep(1000); // 休眠1ms,避免CPU占用率过高 } else { str[n] = '\0'; printf("%s", str); } } // 关闭串口设备 close(fd); return 0; } ``` 运行以上代码,即可打开串口设备并读取数据。如果需要向串口发送数据,则可以使用`write()`函数向串口设备写入数据。例如,以下代码向串口写入字符串`"hello, world\n"`: ```c write(fd, "hello, world\n", strlen("hello, world\n")); ``` 注意,在读取或写入串口数据时,需要考虑数据的格式和协议,以确保数据的正确性和完整性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值