060串口与通讯

来源:互联网 发布:steinberg软件 编辑:程序博客网 时间:2024/05/16 14:00
串口的分类:
USB串口,UART/USART,I2C,SPI,485,232,三总线,单总线。。。。。。

通讯数据的大小,通常为8bit,1byte
设备间的通讯:注意共地

异步:接受和发送不能同时
同步:能同时
流控:控制数据传输(根据硬件设置,有就是USART,没有就是UART)
帧:一码元(通信传输的基本单位,可以包含Nbit的数据,包含数据位,校验位等等,就是一帧,一码元的一串的完整信息)









两者的区别:
是否支持同步和流控,USART是UART的升级版

Linux中的tty就是串口通讯,默认是异步的
DR:数据寄存器,STM32有两个从而支持同步和异步。但在linux中tty默认使用异步,但在Linux中可以用线程互扯的方式,一读一发来解决,虽然实际上是异步,但却用并发来模拟近似于同步,同并发接受和发送,虽然实际是一发一接互扯

********************************************************


UART和USART的接口 定义:
1.UART接口:(速率低,不可靠)
只能通过波特率,周期来获取信息,所以每个位的只能通过等待的方式,而器件之间周期不可能完全一样,所以可能出现丢位错位的情况,特别是数据线越长越是如此
    TxD--发送
    RxD--接受
    GND共地(都有接地线)

2.USART接口:(速率高,可靠稳定)
在波特率,和周期的基础上,每发送一位,先发送个要发送信号,然后再接受该位信息,接受完发送个返回信号确认接受完成,让其再发送信号准备来发送下个位的信号,保证了数据通讯的可靠性
可编程的波特率:最高4.5bmits/s
    CTS--发送流控(发送信号)
    RTS--接受流控(接受对方的信号)
    TxD--发送
    RxD--接受
    GND共地
    SCLK(同步模式下还存在时钟线)

***********************************************************

串口通信的一些概念

DMA:CPU的数据快速搬运
串口通讯中,一些标识成功的标志位要注意清零







关于C标准库
单片机因为内存问题,一些C标准函数最好不要用,因为太占内存了,一些功能可以自己编写,如计算字符串等,
printf在单片机中一般用来调试,用重映射来指定到要打印发送的位置,代码量很大,一般用来调试,用时编译,不用调试时就不编译它,用宏来控制其是否编译比较方便
且使用C的标准库需要手动添加
需要使用一个MicroLIB库,才能真正的使用C库函数。
MicroLIB库在MDK的Options for target ---》Use MicroLIB
且需要包含<stdio.h>头文件

重映射的使用:
使用printf:printf函数的标准输出默认为PC机的屏幕。但是printf函数在设计时,留下了一个“后门”。
可以通过重定义留下的“后门”接口来指定printf输出的通道。比如:输出通道为UART串口等。
接口函数的结构必须如下:
要使用printf函数,只需要重定义输出接口即可,如下:
int fputc(int ch, FILE *f) (改变输出位置,输出方向自己在内定义,且设置时每次传输一个字节)
                                     (printf会调用该函数去输出)
{
USART_SendData(USART1, (uint8_t) ch); (定义为串口,每次一个字节)

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);(等待其确实传输完毕)

return (ch);
}
要使用scanf函数,只需要重定义输入接口即可,如下:
int fgetc(FILE *f)    (改变输入来源,输入来源自己在内定义,且设置时每次传输一个字节)
                              (sacnf会调用该函数去输入)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);(等待其确实传输完毕)

return (int)USART_ReceiveData(USART1);   (返回读到的字节)
}

关于非字符数据
字符0-9能以'0'为基准偏移,在传输int型时可以这样用
如 int 28 能以 2+‘0’,8+‘0’去以拆分为单个字符发送

USART通信的配置同村遵循8N1标准: 表述串口传输数据的数据格式。
(1)8--->8个数据位; 
(2)N--->NO CRC校验; 
(3)1--->1个停止位

*********************************************************************************************************************************

思路:
0.打开相应GPIO和USART的时钟
1.配置GPIO口,输出口配置为复用类,输入口配置为浮空类
2.配置USART配置
        USART_InitStructure.USART_BaudRate = 115200;
//波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//数据字节,有8和9
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//停止位位数
USART_InitStructure.USART_Parity = USART_Parity_No ;
//是否有奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//是否需有流控,根据硬件,看是否要设置成USART,有就是,没有就是UART
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//模式设置,可接受发送单个,或者一起
USART_Init(USART1, &USART_InitStructure);

USART1->SR &= ~(1<<6);
//清空发送完的标志位,因为如果不清空则第一次就会发送数据会失效,因为默认是置一的,且1时会自动进入发送及其发送中断(如果有中断的话),导致第一次要发送的数据还没写完到寄存器就进入发送了。其能被软件置零,且每次被读取该位(也就是标志位检验函数读取该位时)会自定置零
//使能
3.操作
   写入,
   读取,
   标志位检验,写入时写完再检验是否写入,读取是读前先检验是否有数据进来


0 0
原创粉丝点击