STM32 RS232通信
STM32 RS232通信
文章目录
- STM32 RS232通信
- 1、RS232特性概述
- 1.1 DB9 引脚定义
- 1.2 电气特性
- 2、通信原理图
- 3、通信协议
- 4、核心代码
- 5、总结
1、RS232特性概述
RS-232是是串行通信接口,由电子工业协会(Electronic Industries Association, EIA)所制定的异步传输标准接口。在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS是英文“推荐标准”的缩写,232为标识号。RS232是全双工通信,通信距离最远15米内,
以前的计算机比较多使用RS-232接口标准是25个脚的DB-25连接器,现在比较流行使用9个脚的DB-9连接器了。但是慢慢的发现又更加流行使用USB来代替 了,更加省空间。工业控制中RS-232接口一般只使用TXD, RXD和GND三条线就可以实现数据传输。
1.1 DB9 引脚定义

DB9引脚定义及功能对照表:

实物图:


1.2 电气特性
RS-232电平与COMS/TTL电平对比:

需要注意他们之间的信号无法直接进行通信,232使用的是负逻辑,逻辑电压也不同。
2、通信原理图

3、通信协议

数据帧格式:
起始位:占1位,规定为逻辑0电平。
有效数据位:可选5、6、7、8、9个位,LSB在前(最低有效位),MSB在后(最高有效位),即位0到位7,传输有效信息。
校验位:可选占1位,也可以没有该位。
停止位:必须有,可选0.5、1、1.5、2个位,规定为逻辑1电平。
4、核心代码
主要代码如下:
注意:这个例程是直接在串口例程上面改的,直接把串口1改为串口2,并且把系统部分的删除了,所以功能是和串口1的实验效果是一样的。
uart.c
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle;
}; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{ while((USART2->SR&0X40)==0);//循环发送,直到发送完毕 USART2->DR = (u8) ch; return ch;
}
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记void uart2_Init(u32 baudrate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能USART2,GPIOA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PA.2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3//USART 初始化设置USART_InitStructure.USART_BaudRate = baudrate;//串口波特率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(USART2, &USART_InitStructure); //初始化串口2USART_Cmd(USART2, ENABLE); //使能串口2
}void USART2_IRQHandler(void) //串口2中断服务程序
{u8 Res;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART2); //读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始else USART_RX_STA|=0x8000; //接收完成了 }else //还没收到0X0D{ if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } }} }
}
uart.h#define USART_REC_LEN 200 //定义最大接收字节数 200
extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART_RX_STA; //接收状态标记
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
main.cint main(void){ u16 t; u16 len; u16 times=0;delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_Init(); //LED端口初始化KEY_Init(); //初始化与按键连接的硬件接口while(1){if(USART_RX_STA&0x8000){ len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度printf("\r\n您发送的消息为:\r\n\r\n");for(t=0;t<len;t++){USART_SendData(USART2, USART_RX_BUF[t]);//向串口2发送数据while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待发送结束}printf("\r\n\r\n");//插入换行USART_RX_STA=0;}else{times++;if(times%5000==0){printf("\r\n战舰STM32开发板 串口实验\r\n");printf("正点原子@ALIENTEK\r\n\r\n");}if(times%200==0)printf("请输入数据,以回车键结束\n"); if(times%30==0)LED1=!LED1;//闪烁LED,提示系统正在运行.delay_ms(10); }} }
这里是把RS232接到了串口2上,所以初始化串口2就可以,如果需要使用中断,则需要编写中断处理函数和串口重定向功能就可以用来打印信息了。
5、总结
使用RS232实际上就是使用usart,原理是一样的,需要添加一下电平转换芯片就可以用两种进行通信了。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
