ESP8266 SDK开发: 外设篇-串口
串口分布
串口内部自带一个FIFO缓存,数据接收以后先缓存到内部FIFO缓存里面
内部FIFO满了以后进入FIFO满中断
串口打开了串口超时(空闲)中断:超过两个字节的时间没有接受到数据,进入串口超时(空闲)中断
NONOS(先看串口接收)
1.初始化串口是使用下面的函数
里面只写了设置波特率,如果需要设置其它参数可以参考代码的最下面
2.默认是使用串口0输出日志
咱先不用修改,咱先把串口基本操作学完
3.提供的串口中断接收里面是使用任务通知的形式(关于任务通知参见上一节系统任务(消息队列,通知))
在内部FIFO接收到数据的时候发送任务消息出去
在任务中读取数据(读取数据默认提供的是存储到数组缓存里面)
4.咱们获取数据呢是使用下面的函数
函数返回值是获取的数据个数;形参1是咱要把数据拷贝到的数组地址;形参2是咱想获取的数据个数
5.官方还贴心的给了例子
定时器每隔10ms轮训,每次尝试获取128字节数据,获取到数据之后,直接返回接收的数据
6.咱们就直接拷贝到主函数试一试
7.串口接收缓存默认是256字节,如果数据的每一帧的数据量大于这个值,就需要增加
8.再提醒下哈,下面只是尝试获取128字节,假设缓存里面有10个数据,那么也只会返回10个.
假设缓存里面有500个,那么会返回128个.
一般这个值取最大可能返回的数据个数.
9.注意:一般是接收到一条完整的数据之后再去处理数据,但是特殊场合需要快速的通信,如果每条数据的时间间隔小于10ms,
那么便会出现粘包.可以使用任务把轮训间隔缩小到1ms;
首先把串口的任务优先级改为最高
然后在主函数加一个优先级别低的任务
/************任务*************/ #define os_event_t_buff_len 255 /*消息队列长度;最大255*/ os_event_t os_event_t_buff[os_event_t_buff_len]; //存储消息的数组 #define TaskPrio 0 //任务等级(0,1,2(最高)) uint32 os_task_t_delay=0;//在任务里面做延时 /************串口接收缓存**************/ uint8 uart_buf[UART_RX_BUFFER_SIZE]={0}; uint16 len = 0;
void os_task_t_callback(os_event_t *events){ if(events->sig == 0 && events->par ==0){ system_os_post(TaskPrio, 0, 0); } os_task_t_delay++; if(os_task_t_delay>300){//大约1ms os_task_t_delay=0; len = rx_buff_deq(uart_buf, 128 );//尝试从缓存中获取128字节串口数据 tx_buff_enq(uart_buf,len);//把接收的数据返回 } }
system_os_task(os_task_t_callback, TaskPrio, os_event_t_buff, os_event_t_buff_len); system_os_post(TaskPrio, 0, 0);
当然一般串口10ms已经适应了基本上所有的项目了
10.如果想把数据直接存储到自己定义数组里面
把UART_BUFF_EN改为0
NONOS(串口发送数据)
默认的发送是使用的缓存+中断发送
建议用户直接使用这种方式.因为发送数据的时候不会阻塞.
关于 os_printf
os_printf函数一般是做日志打印的,默认是使用串口0打印;可以配置到串口1上(gpio2口上)
os_printf函数可以使用下面的函数关闭或者开启打印
system_set_os_print (0);//0:关闭打印 1:开启打印