对于我来收,RS232和485的区别目前来说并不是很大,因为只用到了数据的收发,对于大项目的作用,RS485用的比较多。
RT-Thread的比Keil好用多了,这两者的概念我不清楚,比如我只是认为Keil只是用来编辑、编译、烧录、调试的工具(调试用的比较少)。Keil使用一个CPIO口需要对这个口初始化、使能、模式等一系列操作,但是RT-Thread不一样
/* 设置LED引脚为输出模式 */
rt_pin_mode(136, PIN_MODE_OUTPUT);
这样就方便很多,但是终究还是需要学习底层的。
直接开始吧
写代码之前,想想如何完成串口数据收发。
定义串口名字
#define UART1_NAME "uart1"
/* 串口设备句柄 */
static rt_device_t serial;
/* 串口初始化默认参数 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
查找串口
char uart_name[RT_NAME_MAX];
/* 定义一个uart_name,用于寻找串口 */
rt_strncpy(uart_name, UART3_NAME, RT_NAME_MAX);
/* 查找系统中的串口设备 */
serial = rt_device_find(uart_name);
if (!serial)
{
rt_kprintf("find %s failed!\n", uart_name);
return RT_ERROR;
}
打开串口,定义接收回调函数
/* 以中断接收及轮询发送模式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
/* 设置接收回调函数 */
rt_device_set_rx_indicate(serial, uart_input);
发送一个数据,使串口触发中断
char str[] = "hello";
/* 发送字符串 */
rt_device_write(serial, 0, str, sizeof(str));
触发中断
rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/* 串口接收到数据后产生中断,调用此回调函数 */
char ch;
/*设置LED引脚为输出模式,默认高电平*/
rt_pin_mode(136, PIN_MODE_OUTPUT);
rt_pin_write(136, PIN_HIGH);
while (rt_device_read(dev, 0, &ch, 1) == 0)
;
if(ch == 's')
{
rt_pin_write(136, PIN_LOW);
}
else if(ch == 'p')
{
rt_pin_write(136, PIN_HIGH);
}
rt_device_write(dev, 0, &ch, 1);
return RT_EOK;
}
中断函数把接收到的字符重新读取,再发送到PC端。
目前似乎只支持一个字符,待过一天再进行升级。
#include <rtthread.h>
#include <serial.h>
#include "uart1.h"
#include <pin.h>
#include <rtdef.h>
#define UART1_NAME "uart1"
static rt_device_t serial;
/* 初始化配置参数 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
/* 接收数据回调函数 */
rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/* 串口接收到数据后产生中断,调用此回调函数 */
char ch;
/*设置LED引脚为输出模式,默认高电平*/
rt_pin_mode(136, PIN_MODE_OUTPUT);
rt_pin_write(136, PIN_HIGH);
while (rt_device_read(dev, 0, &ch, 1) == 0)
;
if(ch == 's')
{
rt_pin_write(136, PIN_LOW);
}
else if(ch == 'p')
{
rt_pin_write(136, PIN_HIGH);
}
rt_device_write(dev, 0, &ch, 1);
/*发送完数据,将RE#引脚设置低电平,串口为输入模式*/
rt_pin_write(44, PIN_LOW);
return RT_EOK;
}
int uart_sample(void)
{
rt_err_t ret = RT_EOK;
char uart_name[RT_NAME_MAX];
char str[] = "hello";
rt_strncpy(uart_name, UART3_NAME, RT_NAME_MAX);
/* 查找系统中的串口设备 */
serial = rt_device_find(uart_name);
if (!serial)
{
rt_kprintf("find %s failed!\n", uart_name);
return RT_ERROR;
}
/* 以中断接收及轮询发送模式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
/* 设置接收回调函数 */
rt_device_set_rx_indicate(serial, uart_input);
/* 发送字符串 */
rt_device_write(serial, 0, str, sizeof(str));
return ret;
}