RS485实现串口功能(含printf打印函数)

rs485和普通串口其实是差不多的,多了一个引脚,工作在半双工
在这里插入图片描述
RX和TX表示接收和发送,rs485-de表示控制位,0等待接收,1表示要发送数据了。按照这个特性可以编写函数
①定义结构体
②RX浮空输入,TX复用推挽输出,RE485-DE推挽输出
③波特率,中断优先级,接收模式等配置
④使能中断,使能串口
⑤中断函数写入操作

具体实现

void uart_init(u32 bound)
{
  	GPIO_InitTypeDef GPIO_InitStructure;
  	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1_TX   PA9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//USART1_RX	  PA10初始化
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 

	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //RE485-DE  PA8
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	//推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
	RE485_DE=0;               //拉低
	
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

  USART_Init(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1 
}

中断函数

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		USART_ClearFlag(USART1, USART_IT_RXNE); //清除标志位;
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
	  	/*写入要执行的操作*/	 
	} 

} 

关于printf怎么用RS485实现
在相关函数修改

#include "stdio.h"	//这个头文件要调佣


int fputc(int ch, FILE *f)
{      	
	RE485_DE=1;
	USART_SendData(USART1, (uint8_t) ch);
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 
	RE485_DE=0;
	return ch;
}

完成上述操作后就可以使用printf打印了

以下为一个基本的RS485串口通信程序示例,使用了Windows API函数: ```c #include <windows.h> HANDLE hSerial; int main() { hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hSerial == INVALID_HANDLE_VALUE) { printf("Error opening serial port.\n"); return 1; } DCB dcbSerialParams = {0}; dcbSerialParams.DCBlength = sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) { printf("Error getting serial parameters.\n"); CloseHandle(hSerial); return 1; } dcbSerialParams.BaudRate = CBR_9600; dcbSerialParams.ByteSize = 8; dcbSerialParams.StopBits = ONESTOPBIT; dcbSerialParams.Parity = NOPARITY; if (!SetCommState(hSerial, &dcbSerialParams)) { printf("Error setting serial parameters.\n"); CloseHandle(hSerial); return 1; } COMMTIMEOUTS timeouts = {0}; timeouts.ReadIntervalTimeout = 50; timeouts.ReadTotalTimeoutConstant = 50; timeouts.ReadTotalTimeoutMultiplier = 10; timeouts.WriteTotalTimeoutConstant = 50; timeouts.WriteTotalTimeoutMultiplier = 10; if (!SetCommTimeouts(hSerial, &timeouts)) { printf("Error setting timeouts.\n"); CloseHandle(hSerial); return 1; } char data[] = "Hello, world!"; DWORD bytesWritten; if (!WriteFile(hSerial, data, sizeof(data), &bytesWritten, NULL)) { printf("Error writing data to serial port.\n"); CloseHandle(hSerial); return 1; } char buffer[1024]; DWORD bytesRead; if (!ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL)) { printf("Error reading data from serial port.\n"); CloseHandle(hSerial); return 1; } CloseHandle(hSerial); return 0; } ``` 该程序使用了以下Windows API函数: - `CreateFile`:打开串口设备句柄。 - `GetCommState`、`SetCommState`:获取和设置串口通信参数。 - `SetCommTimeouts`:设置读写超时时间。 - `WriteFile`:向串口写入数据。 - `ReadFile`:从串口读取数据。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木白CPP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值