stm32vet6 RS485通信程序 需另外自己購買USB轉485的模塊
單片機源程序如下:
- #include "main.h"
- #include "delay.h"
- #include "uart5.h"
- int main(void)
- {
- u16 len;
- u8 time;
-
- delay_init(); //延時初始化
- RS485_1_Init(9600); //第一路485初始化
-
- while(1)
- {
- if(time>=50) //time>=50表示500ms時間到
- {
- time=0; //清除計數位
- RS485_1_printf("請您發送數據,以回車結尾\r\n"); //500ms時間到,發送提示信息
- }
- if(RS485_1_RX_STA&0x8000) //RS485_1_RX_STA位15置位,表示接收完成
- {
- len=RS485_1_RX_STA&0x3fff; //得到此次接收到的數據長度
- RS485_1_RX_BUF[len]='\0' ; //加入結束符
- RS485_1_printf("你發送的數據:%s\r\n",RS485_1_RX_BUF); //返回接收到的數據
- RS485_1_RX_STA=0; //清除狀態位
- }
- time++; //計數+1
- delay_ms(10); //延時10ms
- }
- }
復制代碼
- /*-------------------------------------------------*/
- /* RS485_1_1源文件,有2個函數 */
- /*-------------------------------------------------*/
- /* void RS485_1_1_Init(u32 bound) 485初始化串口5*/
- /* void RS485_1_1_printf(char* fmt,...)485printf函數 */
- /*-------------------------------------------------*/
- #include "uart5.h"
- #include "delay.h"
-
- u8 RS485_1_RX_BUF[RS485_1_RXBUFF_SIZE]; //接收緩存區
- u16 RS485_1_RX_STA=0; //接收狀態標記
- /*-------------------------------------------------*/
- /*函數名:初始化串口5-RS485_1 */
- /*參 數:bound:波特率 */
- /*返回值:無 */
- /*-------------------------------------------------*/
- void RS485_1_Init(u32 bound)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE); //使能串口5時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能GPIOC時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //使能GPIOD時鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PC12
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC12
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PD2
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
- GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化PD2
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PD4
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //復用推挽輸出
- GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化PD4
-
- 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(UART5, &USART_InitStructure); //按配置設置串口4
-
- USART_Cmd(UART5, ENABLE); //使能串口5
- USART_ClearFlag(UART5, USART_FLAG_TC); //清除標志位
- USART_ITConfig(UART5, USART_IT_RXNE, ENABLE); //開啟接受中斷
- NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn; //串口5中斷
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //搶占優先級3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子優先級3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中斷通道使能
- NVIC_Init(&NVIC_InitStructure); //根據配置設置
-
- RS485_1_RX_TX=0; //接收模式
- }
- /*-------------------------------------------------*/
- /*函數名:第一路485的printf */
- /*參 數:無 */
- /*返回值:無 */
- /*-------------------------------------------------*/
- __align(8) u8 RS485_1_TX_BUF[RS485_1_TXBUFF_SIZE];
- void RS485_1_printf(char* fmt,...)
- {
- u16 i,length;
-
- va_list ap;
- va_start(ap,fmt);
- vsprintf((char*)RS485_1_TX_BUF,fmt,ap);
- va_end(ap);
-
- RS485_1_RX_TX=1; //發送模式
- delay_ms(1);
-
- length=strlen((const char*)RS485_1_TX_BUF);
- while((UART5->SR&0X40)==0);
- for(i = 0;i < length;i ++)
- {
- UART5->DR = RS485_1_TX_BUF[i];
- while((UART5->SR&0X40)==0);
- }
-
- RS485_1_RX_TX=0; //接收模式
- delay_ms(1);
- }
復制代碼
所有資料51hei提供下載:
7-第1路 RS485_1 通信測試程序.rar
(272.4 KB, 下載次數: 56)
2018-11-28 17:37 上傳
點擊文件名下載附件
已成功通過測試 下載積分: 黑幣 -5
|