文章目錄
- 串口
- 分類(資訊傳送方向)
- 單工
- 雙工
- 全雙工(full duplex)
- 時分雙工 TDD
- 頻分雙工 FDD
- 半雙工 (half duplex)
- RS232介面缺陷
- RS485 特點
- 推薦連接方式
- 收發器 SP3485
- 硬體連接
- 實驗代碼
串口
即串行介面,也叫串行通信介面或串行通訊介面(通常指COM介面),是采用串行通信方式的擴展介面,串行介面(Serial Interface)是指資料一位一位地順序傳送,
特點:通信線路簡單,傳送速度較慢,
串口規定介面的電氣標準,物理層標準,未規定介面插件電纜及使用的協議,
典型串行通訊標準 RS232和RS485
分類(資訊傳送方向)
單工
資料傳輸只支持資料在一個方向上傳輸
雙工
兩臺通訊設備,允許雙向資料傳輸
(傳送的資料及接收資料使用同一物理介質)
全雙工(full duplex)
兩臺設備同時進行雙向資料傳輸 eg:電話、手機
使用雙絞線中兩條不同的線路 , 不會發生沖突
時分雙工 TDD
模擬全雙工的半雙工(在鄰近區段中增加保護區段 或 加有同步機制的系統)
在非對稱網路(上傳下載帶寬不平衡的網路)中的優點:
動態調整帶寬 波束成形技術的運用
頻分雙工 FDD
設備傳送接收使用不同的頻帶 設備不會接收到傳出的資料 傳送接收的資料不會相互影響
上傳下載的區段用“頻率偏移”的方式分隔
eg:WCDMA UMTS(3G)
半雙工 (half duplex)
兩臺設備之間不同時的雙向資料傳輸,易發生傳輸沖突
eg:與集線器相連的節點(多個節點共享一條到交換機埠的連接)
RS232介面缺陷
信號電平值高 易損壞介面電路的芯片
傳輸速率較低
抗噪聲干擾性弱
傳輸距離有限(50m)
RS485 特點
介面電平低 不易損壞芯片
傳輸速率高
抗干擾能力強
傳輸距離遠 支持節點多
使用在線性的點對點網路中
推薦連接方式

添加匹配電阻,在總線的起止端加入,即主機和設備4上面各加一個120Ω的匹配電阻,
收發器 SP3485

A、B總線介面:連接485總線
RO:接收輸出端
DI:發送資料收入端
RE:接收使能信號
DE:發送使能信號
硬體連接

R38、 R40是兩個偏置電阻,避免總線空閑時壓差不定邏輯混亂
兩個485介面連接 A連接A B連接B

實驗代碼
初始化
void RS485_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIO時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時鐘
//串口2引腳復用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2復用USART2
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3復用為USART2
//USART2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2與GPIOA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//?復用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復用輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA2 PA3
//PG8推挽輸出485模式控制
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOG8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOG,&GPIO_InitStructure); //初始化PG8
//USART2 初始化設定
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(USART2, &USART_InitStructure); //初始化串口2
USART_Cmd(USART2, ENABLE); //使能串口2
USART_ClearFlag(USART2, USART_FLAG_TC);
#if EN_USART2_RX
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//接收中斷
//Usart2 NVIC
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據指定的引數初始化VIC暫存器
#endif
RS485_TX_EN=0; //默認 接收模式
}
主函式
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "rs485.h"
int main(void)
{
u8 key;
u8 i=0,t=0;
u8 cnt=0;
u8 rs485buf[5];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);
LED_Init();
LCD_Init();
KEY_Init();
RS485_Init(9600);
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,70,200,16,16,"RS485 TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/5/7");
LCD_ShowString(30,130,200,16,16,"KEY0:Send");
POINT_COLOR=BLUE;
LCD_ShowString(30,150,200,16,16,"Count:");
LCD_ShowString(30,170,200,16,16,"Send Data:");
LCD_ShowString(30,210,200,16,16,"Receive Data:");
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)//KEY0按下發送一次資料
{
for(i=0;i<5;i++)
{
rs485buf[i]=cnt+i;//填充發送緩沖區
LCD_ShowxNum(30+i*32,190,rs485buf[i],3,16,0X80); //顯示資料
}
RS485_Send_Data(rs485buf,5);//發送五個位元組
}
RS485_Receive_Data(rs485buf,&key);
if(key)//接收到資料
{
if(key>5)key=5;//最大五個資料.
for(i=0;i<key;i++)LCD_ShowxNum(30+i*32,230,rs485buf[i],3,16,0X80); //顯示資料
}
t++;
delay_ms(10);
if(t==20)
{
LED0=!LED0;//提示系統正在運行
t=0;
cnt++;
LCD_ShowxNum(30+48,150,cnt,3,16,0X80); //顯示資料
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301599.html
標籤:其他
