打印
[牛人杂谈]

串行通讯介绍+程序编写+程序编写的优化

[复制链接]
843|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
500days|  楼主 | 2016-4-12 20:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

首先比较一下串行通讯和并行通讯的特点。

并行通讯的特点:接线较多,速度快,控制简单。

串行通讯的特点:接线少,速度慢,控制复杂。


一、串口通讯的传输方向:

(1)单工:数据传输仅能沿一个方向。不能事项反向传输。

(2)半双工:数据传输可以沿两个方向,但需要分时进行。

(3)全双工:数据可以同时进行双向传输。

半双工的通讯实例(RS485通讯电路):

一个数据通道,是差分信号,由A线和B线共同构成。

接收管脚1,发送管脚4,方向控制管脚2、3,当方向控制管脚拉低时,允许485总线上的数据传到单片机(左边);当方向控制管脚拉高,允许单片机向485总线上发送数据。

倘若有很多设备挂在485总线上,这些设备在同一时刻只有一个设备处在发送状态,其他设备都处于接收状态。如果在同一时刻有两个或两个以上设备处于发送状态会导致485总线错误,通讯失败。因此设计电路和编写程序都要注意。在每次单片机发送数据完毕后要把发送管脚的电平拉低,不允许485总线上其他设备发送数据。

二、串行通信的类型:

(1)同步通信:指发送方在同步时钟的控制下,将数据逐位发出去,接收方在同步时钟控制下逐位接收,如SPI,IIC等。

(2)异步通信:指双方要线约定好通讯格式,如:波特率,数据格式(位数,有无起始位、停止位个数、有无校验位)如UART,单总线通讯(DS18B20)

三、stm32f4 串口通讯程序编程:

1.    新建串口通讯模块文件:SCI.C和SCI.H

2.    编写 SCI.C和SCI.H文件

(1)    开启 USART1时钟 :RCC_APB2PeriphClockCmd

(2)    开启GPIOA时钟:RCC_AHB1PeriphClockCmd

(3)    配置GPIOA Pin9和Pin10为串口功能:GPIO_Init和GPIO_PinAFConfig

(4)    初始化串口参数:USART_Init

(5)    串口中断配置:USART_ITConfig

(6)    中断优先配置:NVIC_PriorityGroupConfig和NVIC_Init

(7)    使能串口:USART_Cmd

(8)    串口中断函数编写

(9)    在main函数中调用串口初始化


沙发
玛尼玛尼哄| | 2016-4-13 13:24 | 只看该作者
232通信接口可以跟485接口进行通信吗,他们是一样的不是

使用特权

评论回复
板凳
gejigeji521| | 2016-4-13 20:51 | 只看该作者
1. RS-485的电气特性:采用差分信号负逻辑,逻辑"0”以两线间的电压差为+(2~6)V表示;逻辑"1"以两线间的电压差为-(2~6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL电路连接。
2. RS-485的数据最高传输速率为10Mbps。
3. RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
4. RS-485最大的通信距离约为1219m,最大传输速率为10Mbps,传输速率与传输距离成反比,在100KbpS的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加485中继器。RS-485总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。

使用特权

评论回复
地板
ccw1986| | 2016-4-14 22:15 | 只看该作者
串行通信比较节省资源,IO口用的少

使用特权

评论回复
5
稳稳の幸福| | 2016-4-14 22:37 | 只看该作者
新唐M051 UART0使用程序
#include "UART.h"
/****************************************
*函数名称:UartInit
*输    入:unFosc   晶振频率
          unBaud  波特率
*输    出:无
*功    能:串口初始化
******************************************/
VOID UartInit(UINT32 unFosc,UINT32 unBaud)
{
    P3_MFP &= ~(P31_TXD0 | P30_RXD0);  
    P3_MFP |= (TXD0 | RXD0);      //P3.0 使能为串口0接收
          //P3.1 使能为串口0发送
    UART0_Clock_EN;         //串口0时钟使能
    UARTClkSource_ex12MHZ;  //串口时钟选择为外部晶振
    CLKDIV &= ~(15<<8);  //串口时钟分频为0
    IPRSTC2 |= UART0_RST;   //复位串口0
    IPRSTC2 &= ~UART0_RST;  //复位结束
    UA0_FCR |= TX_RST;      //发送FIFO复位
    UA0_FCR |= RX_RST;      //接收FIFO复位
    UA0_LCR &= ~PBE;      //校验位功能取消
UA0_LCR &= ~WLS;
    UA0_LCR |= WL_8BIT;     //8位数据位
    UA0_LCR &= NSB_ONE;     //1位停止位
    UA0_BAUD |= DIV_X_EN|DIV_X_ONE;   //设置波特率分频   
    UA0_BAUD |= ((unFosc / unBaud) -2); //波特率设置  UART_CLK/(A+2) = 115200, UART_CLK=12MHz
UA0_IER |= RDA_IEN;     //接收数据中断使能
NVIC_ISER |= UART0_INT;     //使能串口0中断
}
/****************************************
*函数名称:UartSend
*输    入:pBuf     发送数据缓冲区
          unNumOfBytes  发送字节总数
*输    出:无
*功    能:串口发送数据
******************************************/
VOID UartSend(UINT8 *pBuf,UINT32 unNumOfBytes)
{
  UINT32 i;
  for(i=0; i<unNumOfBytes; i++)
  {
         UA0_THR = *(pBuf+i);
         while ((UA0_FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空
  }
}
/****************************************
*函数名称:UART0_IRQHandler
*输    入:无
*输    出:无
*功    能:串口0中断服务函数
******************************************/
VOID UART0_IRQHandler(VOID)
{
    UINT8 ucData;
if(UA0_ISR & RDA_INT)     //检查是否接收数据中断
{  
  while(UA0_ISR & RDA_IF)    //获取所有接收到的数据
  {
   while (UA0_FSR & RX_EMPTY);  //检查接收FIFO是否为空   
   ucData = UA0_RBR;    //读取数据
   UartSend(&ucData,1);   //发送数据
   //以下测试接收数据用
    if(ucData == 0x11)  P2_DOUT &= ~0xff;
    if(ucData == 0xff)  P2_DOUT |= 0xff;
  }
}
}
/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
// unsigned char i,j;
     PROTECT_REG
  (            //ISP下载时保护FLASH存储器
   PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
   while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定
   CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
   //以下测试接收数据
   //P2_PMD=0x5555;          //GPIO设置为输出模式  
  )
  UartInit(12000000,9600);      //波特率设置为9600bps
  while(1)
  {
/*   j=0;
                //发送数据0~255
    for(i=0; i<256; i++)
    {
       UartSend(&j,1);
     j++;
     Delayms(50);   
    } */
  }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

120

帖子

3

粉丝