前一篇《UART Explained》介绍了UART的基本信息,重点分析了UART的信号。本文摘录的文章则重点介绍了波特率(Baud Rate)相关的内容,波特率越高,传输速度越快,但实际使用时波特率是越高越好吗,多少合适?文中给出了答案,具体如下。

  Although the PIC32 is an elegant and powerful microcontroller, it doesn't stand so tall when compared against a PC in terms of raw computing power! Sometimes it makes sense to use the feasability of the microcontroller to work as a sensor or an embedded controller of some type but still be able to communicate with a more powerful computer. Sometimes you might just want a quick visual display or a printf terminal for debugging. Whatever the reason, this tutorial will provide a basic guide to PIC32 / PC communication.

UART

  The module used for such communication is the PIC's Universal Asynchronous Receiver/Transmitter (UART) pronounced "you-art". For those familiar with computer music, the MIDI protocol uses a UART to do its serial communication. For those familiar with the Arduino, the TX/RX pins on an Arduino are the two main UART pins. In its most basic form the UART hardware consists of a transmit (TX) line and a receive (RX) line. The software configures how fast data is sent (the baud rate) and the specifics of the protocol.

Baud Rate

  Since the UART module is asynchronous, there is no external clock line like the synchronous protocols SPI or I2C. Instead, both communicating devices must have their own clock sources configured to the same frequency. As long as these clocks match one another, data should be transferred smoothly. On the PIC32, the UxBRG special function register configures this rate called the baud rate. Note that the x in UxBRG is a placeholder for the reference number of the UART that is being configured. Common baud rates include 4800, 9600, 19200, 57600, and 115200 bits/s. Different baud rates can be chosen by the PIC32 but you must always make sure both devices are very stable at the selected rate. Sometimes it's best to select a lower baud rate to reduce the chance of errors. Since there is no shared clock, the hardware is simpler but there is an increased chance for the clocks to be out of sync causing incorrect data to be interpreted on the receiving end. For this reason, lower baud rates like 9600 are very popular.

  The equation to configure the baud rate using the UxBRG register is below:

8N1

  Like with most peripherals, the configuration options can be overwhelming! We'll be configuring our UART to use the standard 8N1 format. 8N1 meaning that each data trasfer consists of 8 bits of data, no parity bits, and 1 stop bit.

  The parity bit provides an added layer of error detection. The parity bit is generated by the transmitting unit through a calculation done with the data being sent. If the receiving unit then calculates the same parity bit from the received data, it is assumed that everything is A-O-K. If a different parity bit is calculated, an error is triggered. For example, if odd parity checking is used, the transmitting unit would add up all "1" bits from the data being sent and set the parity bit to 1 if they are odd (like 01001100) or to 0 if even (like 01001101). The receiving unit would use the same calculation and compare the received parity bit to the calculated parity bit. Note that parity checking is done in hardware by the UART unit. However, once a parity error is flagged by the hardware, the programmer must deal with the error in software. Since parity checking will only take you so far (two corrupted bits is treated as no error!), you may desire something more powerful like a Cyclic Redundancy Check (CRC) which is outside the scope of this tutorial.

  The stop bit signifies the end of a data transfer. There will almost always be either one or two stop bits. If the stop bits read by the receiving unit don't match those expected, the receiver will assume its clock drifted out of phase and a the software must deal with this error. It is also implied that a start bit is being sent as well with each transmission. The start bit allows the clock on the receiving end to do a phase lock with the data being received. Otherwise, the receiving end might end up sampling on the data transition edges instead of right in the middle of each bit. The data received would then look like utter nonsense!

  So, in an 8N1 configuration, each byte of data sent is transmitted in the form of a 10-bit frame with the addition of one start bit, one stop bit, and no parity bits.

  The example below configures the PIC32's UART1 module to an 8N1 format with a baud rate of 19200 bits/s and enables both transmit and receive functions (in full duplex mode).

int FPb = 40000000; // peripheral bus clock frequency set at max SYSCLK

int desired_baud = 19200;

U1MODE = 0; // disable autobaud, TX and RX enabled only, 8N1, idle=HIGH

U1STA = 0x1400; // enable TX and RX

U1MODESET = 0x8000; // enable UART1

  Note that in the example above, we are using the standard baud mode set whenUxMODE<3> = 0. The UART clock is only able to take on specific frequencies and this bit helps determine how close the desired baud rate will be to the actual baud rate. When BRGH = 1 (i.e. UxMODE<3> = 1), high-speed mode is activated and the actual baud rate will probably be closer to the desired baud rate. However, each bit received on the UxRX pin will only be sampled once. When BRGH = 0 (i.e. UxMODE<3> = 0), multiple samples are taken on the UxRX pin to determine whether a HIGH or LOW is present. Even though the high-speed mode may have a more accurate baud rate clock, in standard-mode there is less chance to make receiving errors. See the UART reference manual section 21.6 for more information.

  The following table provides a set of desired baud rates, the value you would set BRGH to for this baud rate and the error.

  可以看到,实际波特率和目标波特率会有一些误差,如果通信双方的误差都有点大,那就很容易导致通信错误,所以很多串口通信的协议里都会有校验码,如GPS协议,通过数据帧的校验码可以过滤掉因传输导致的错误,避免异常。

  原文中还有参考代码和调试串口的神器,具体参见: http://umassamherstm5.org/tech-tutorials/pic32-tutorials/pic32mx220-tutorials/uart-to-serial-terminal

  另外,有关串口通信时序错误的详细解析,可参考:http://www.robotroom.com/Asynchronous-Serial-Communication-2.html(好似被墙,pdf档在此)

  波特率计算工具:http://mspgcc.sourceforge.net/baudrate.html

UART to Serial Terminal(转载)的更多相关文章

  1. RS-232 vs. TTL Serial Communication(转载)

    RS-232串口一度像现在的USB接口一样,是PC的标准接口,用来连接打印机.Modem和其他一些外设.后来逐渐被USB接口所取代,现在PC上已经看不到它的身影了.开发调试时如果用到串口,一般都是用U ...

  2. 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 百篇博客分析OpenHarmony源码 | v67.01

    百篇博客系列篇.本篇为: v67.xx 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...

  3. JTAG 引脚自动识别 JTAG Finder, JTAG Pinout Tool, JTAG Pin Finder, JTAG pinout detector, JTAGULATOR, Easy-JTAG, JTAG Enumeration

    JTAG Finder Figuring out the JTAG Pinouts on a Device is usually the most time-consuming and frustra ...

  4. Keil debugging techniques and alternative printf (SWO function)

    One of the basic needs of the embedded software development through the terminal to output debugging ...

  5. 随想录(skyeye中的soc仿真)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 想学好soc,再怎么看芯片手册和linux kernel都不为过.但是要学习好kernel,那再 ...

  6. The TTY demystified

    http://www.linusakesson.net/programming/tty/index.php The TTY demystified Real teletypes in the 1940 ...

  7. nRF52-PCA10040——Overview

    Overview Zephyr applications use the nrf52_pca10040 board configuration to run on the nRF52 Developm ...

  8. [Intel Edison开发板] 02、Edison开发板入门

    一.前言 Start from the link: 开始学习的链接 上面链接是官网的教程,按照教程可以开发板入门: 其中第一步是了解开发板,涉及到如何组装.如何连线.一些主要的接口简单介绍等信息: 第 ...

  9. 【图像处理】【SEED-VPM】4.串口调试信息

    —————————————————————————————————————————————————————————————————————— 串口返回正确的信息 Booting PSP Boot Lo ...

随机推荐

  1. Pizza Pie Charts – 基于 Snap SVG 框架的响应式饼图

    Pizza Pie Charts 是一个基于 Adobe 的 Snap SVG 框架的响应式饼图插件.它着重于集成 HTML 标记和 CSS,而不是 JavaScript 对象,当然Pizza Pie ...

  2. (转)JavaScript二:JavaScript语言的基本语法要求

    摘自:http://blog.csdn.net/erlian1992 要学习好JavaScript,首先我们要懂JavaScript语言的一些基本语法要求: 一,区分大小写 JavaScript语言区 ...

  3. jquery图片查看插件,支持旋转、放大、缩小、拖拽、缩略图(仿qq图片查看)

    最近做了一个jquery图片查看的插件,目的是能精确查看图片的详情,插件支持图片旋转.放大.缩小.拖拽.缩略图显示,界面效果是按照window的qq查看图片功能写的,当然不尽相同. 具体功能: 1. ...

  4. 3D Touch介绍:电子秤App与快捷操作

    随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...

  5. JAVA IO 字节流与字符流

    文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.     ...

  6. android 进程间通信数据(一)------parcel的起源

    关于parcel,我们先来讲讲它的“父辈” Serialize. Serialize 是java提供的一套序列化机制.但是为什么要序列化,怎么序列化,序列化是怎么做到的,我们将在本文探讨下. 一:ja ...

  7. webapp设置适应pc和手机的页面宽高以及布局层叠图片文字

    <!DOCTYPE html> <html lang="zh-cn"> <head> <title>我趣旅行网-美剧迷</ti ...

  8. MongoDB Java Driver

    本文使用 Java 来描述对 Mongodb 的相关操作,数据库版本是 3.2.8,驱动版本为 3.2.2. 本文将讨论 如何连接MongoDB 文档的 CURD 操作 文档的上传和下载 1. 连接到 ...

  9. 为什么Java中字符串是不可变的

    前言 在Java中,字符串是一个不可变的类,一个不可变的类指的是它的实例对象不能被修改,所有关于这个对象的信息在这个对象被创建时已初始化且不能被改变. 不可变类有很多优势,这篇文章总结了字符串类之所以 ...

  10. spring中的bean

    环境准备 Eclipse上新建一个简单的maven工程,Artifact Id选择maven-archetype-quickstart: 添加spring-context依赖: <depende ...