电子说
简介
波特率决定了数据传输速率,其表示每秒传送数据的位数,值越大,数据通信的速率越高,数据传输得越快。常见的波特率有4800、9600、14400、19200、38400、115200等等,若波特率为115200,则表示每秒钟可以传输115200位(注意:是bit,不是byte)数据。
数据线上没有数据传输时,数据线处于空闲状态。空闲状态的电平逻辑为“1”。
数据位
奇偶校验位
1. 奇校验:通过设置该位的值(“1”或“0”),使该位和数据位中逻辑“1”的总个数为奇数。例如,数据位为8位,值为:10011001,“1”的个数为4个(偶数),则奇校验时,为了使“1”的个数为奇数,就要设置奇偶校验位的值为“1”,使“1”的总个数为5个(奇数)。
2. 偶校验:通过设置该位的值(“1”或“0”),使该位和数据位中逻辑“1”的总个数为偶数。例如,数据位为8位,值为:10011001,“1”的个数为4个(偶数),则偶校验时,为了使“1”的个数为偶数,就要设置奇偶校验位的值为0,使“1”的个数保持不变,为4(偶数)。
通信双方使用的校验方法应该一致,接收方通过判断“1”的个数是否为奇数(奇校验)或偶数(偶校验)来判定数据在通信过程中是否出错。
停止位
注意:
通信双方必须使用完全相同的配置,包括波特率、起始位、数据位、停止位等。如果配置不一致,则通信数据会错乱,不能正常通信。在通信中,若出现乱码的情况,应该首先检查通信双方所使用的配置是否一致。
接口介绍
函数原型 | 简要描述 |
aw_err_t aw_serial_flush_read (int fd); | 串口刷新读取 |
aw_err_t aw_serial_dcb_set (int fd, const struct aw_serial_dcb *p_dcb); | 配置串口设备参数 |
aw_err_t aw_serial_dcb_get (int fd, struct aw_serial_dcb *p_dcb); | 获取串口设备配置参数 |
aw_err_t aw_serial_timeout_set (int fd, struct aw_serial_timeout *p_cfg); | 配置超时参数 |
aw_err_t aw_serial_timeout_get (int fd, struct aw_serial_timeout *p_cfg); | 获取超时参数 |
类型 | 简要描述 |
struct aw_serial_dcb | 串口配置结构描述 |
struct aw_serial_timeout | 串口超时设置 |
1. aw_serial_dcb:
struct aw_serial_dcb {
uint32_t baud_rate;
uint32_t byte_size:4;
uint32_t f_parity:1;
uint32_t parity:1;
uint32_t stop_bits:2;
uint32_t f_ctsflow:1;
uint32_t f_rtsctrl:2;
uint32_t f_dsrsensitivity:1;
uint32_t f_dsrflow:1;
uint32_t f_dtrctrl:2;
uint32_t f_outx:1;
uint32_t f_inx:1;
uint32_t f_fast_respond_recv:1;
uint32_t f_dummy:14;
uint16_t xon_lim;
uint16_t xoff_lim;
char xon_char;
char xoff_char;
};
成员详解:
baud_rate:波特率;
byte_size:数据位宽度,范围:[5:8];
f_parity:奇偶校验,1:使能 0:禁能;
parity:校验方法;
宏定义 | 含义 |
AW_SERIAL_EVENPARITY | 偶效验 |
AW_SERIAL_ODDPARITY | 奇效验 |
表4 串口停止位数取值表
宏定义 | 含义 |
AW_SERIAL_ONESTOPBIT | 1 位停止位 |
AW_SERIAL_ONE5STOPTS | 1.5 位停止位 |
AW_SERIAL_TWOSTOPBITS | 2 位停止位 |
AW_SERIAL_STOP_INVALID | 0 表示无效停止位 |
表5 串口设备RTS(request-to-send)流控取值表
宏定义 | 含义 |
AW_SERIAL_RTS_HANDSHAKE | 硬件流控 |
AW_SERIAL_RTS_DISABLE | 软件控制RTS无效 |
AW_SERIAL_RTS_ENABLE | 软件控制RTS有效 |
AW_SERIAL_RTS_INVALID | 无效RTS |
表6 串口设备DTR(data-terminal-ready)流控取值表
宏定义 | 含义 |
AW_SERIAL_DTR_HANDSHAKE | 硬件流控 |
AW_SERIAL_DTR_DISABLE | 软件控制DTR无效 |
AW_SERIAL_DTR_ENABLE | 软件控制DTR有效 |
AW_SERIAL_DTR_INVALID | 无效DTR |
注解:
1.该配置项适用于接收时间敏感型应用,例如modbus;
2.该配置项实现通用的手段是将串口接收FIFO设置为1,当接收到一个数据后就产生接收中断。对于没有FIFO的串口来说,这个设置也许会被忽略。
f_dummy:保留位;
2. aw_serial_timeout:
struct aw_serial_timeout {
uint32_t rd_timeout;
uint32_t rd_interval_timeout;
}
成员详解:
rd_timeout:读超时时间;
rd_interval_timeout:码间超时。
使用样例
AWorksLP SDK相关使用请参考《AWorksLP SDK快速入门(MR6450)——开箱体验》一文,本文不在赘述。
1. UART0收发功能
/**
* rief 串口 demo
*
eturn 无
*/
aw_local void* __task_handle (void *parg)
{
char buf[32];
int len = 0;
struct aw_serial_dcb dcb;
aw_err_t ret;
struct aw_serial_timeout timeout;
int fd;
fd = aw_open(CONFIG_DEMO_SERIAL_DEVICE_NAME,AW_O_RDWR,0);
if(fd < 0){
aw_kprintf("serial open failed
");
aw_close(fd);
return 0;
}
/* 获取dcb的默认配置 */
ret = aw_serial_dcb_get(fd, &dcb);
if (AW_OK != ret) {
aw_kprintf("serial get dcb failed: %d
",ret);
aw_close(fd);
return 0;
}
/* 配置串口波特率为115200,8个数据位,1位停止位,无奇偶校验 */
dcb.baud_rate = 115200;
dcb.byte_size = 8;
dcb.stop_bits = AW_SERIAL_ONESTOPBIT;
dcb.f_parity = AW_FALSE;
ret = aw_serial_dcb_set(fd, &dcb);
if (AW_OK != ret) {
aw_kprintf("serial set dcb failed: %d
",ret);
aw_close(fd);
return 0;
}
/* 配置串口超时 */
ret = aw_serial_timeout_get(fd, &timeout);
if (AW_OK != ret) {
aw_kprintf("serial get timeout failed: %d
",ret);
aw_close(fd);
return 0;
}
timeout.rd_timeout = 1000; /* 读总超时为1s */
timeout.rd_interval_timeout = 50; /* 码间超时为50ms */
ret = aw_serial_timeout_set(fd, &timeout);
if (AW_OK != ret) {
aw_kprintf("serial set dcb failed: %d
",ret);
aw_close(fd);
return 0;
}
/* 收到什么数据就发送什么数据 */
AW_FOREVER {
/* 读取数据 */
memset(buf, 0, sizeof(buf));
len = aw_read(fd, buf, sizeof(buf));
if (len > 0) {
aw_write(fd, buf, len);
aw_kprintf("%s
",buf);
}
}
aw_close(fd);
return 0;
}
AW_TASK_DECL(serial_tsk, 4096);
/******************************************************************************/
void demo_serial_int_entry (void)
{
aw_task_id_t tsk;
tsk = AW_TASK_INIT( serial_tsk,
"Serial int demo",
12,
4096,
__task_handle,
(void *)NULL);
if (tsk == NULL) {
aw_kprintf("Serial int demo task create failed
");
return;
}
if (aw_task_startup(tsk) != AW_OK) {
AW_TASK_TERMINATE(serial_tsk);
}
}
例程默认使用/dev/uart0对应开发板DUART丝印串口,其引脚位置如图1所示:
图1 UART0排针
上述代码中创建了一个任务,在任务中实现UART收发功能。使用aw_serial_dcb_get接口获取串口当前的配置信息,修改波特率为115200,8个数据位,1位停止位,无奇偶校验。使用aw_serial_dcb_set接口设置串口。使用aw_serial_timeout_get获取串口时间相关配置信息,修改读总超时为1s,码间超时为50ms,使用aw_serial_timeout_set设置串口。
在AW_FOREVER 循环中使用aw_read接口读取接收到的串口数据,若读取到数据则使用aw_write接口把读取到数据通过该串口发送回去,以此来实现回显功能。
但由于/dev/uart0默认为shell所使用的串口,在shell组件中已开启回显,故此时实验现象如图2所示,会将接收到的数据输出两次,若需实现单次回显,可修改shell组件所引用串口,或修改例程使用的UART设备,具体操作参考下节内容。
图2 串口打印结果
2. UART5收发功能
串口例程中默认使用的是/dev/uart0,为与例程现象描述一致,故将其修改为/dev/uart5。在开发板丝印URX1与UTX1对应设备/dev/uart5,URX2与UTX2对应设备为/dev/uart10,如图3、图4、图5所示。
图3 排针处串口
图4 排针原理图
图5 UART1对应UART5
2.1 打开config 配置脚本,选择例程使用串口为/dev/uart5, 如图6所示,保存后重新build 工程。
图6 UART1对应UART5
2.2 将USB 转串口接到开发板排针丝印UTX1与URX1 的位置,重新编译下载运行固件,会发现发送数据后不会再重复回复两条相同的数据如图7所示。
图7 串口打印信息
至此,UART设备的收发功能介绍完毕,更多外设的使用介绍请关注后续推文。
原文标题:【产品应用】AWorksLP 样例详解(MR6450)——UART
文章出处:【微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。
全部0条评论
快来发表一下你的评论吧 !