1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
RS232和RS485串口
对于我来收,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端。 目前似乎只支持一个字符,待过一天再进行升级。 代码,具体调用可直接添加到main.c文件后再修改一点 #include #include #include "uart1.h" #include #include #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; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:26 , Processed in 0.839172 second(s), Total 75, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号