Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
AT Socket中的串口问题,原因已经找到,usart.c问题,如下
发布于 2018-12-05 18:16:08 浏览:3234
订阅该版
* 本帖最后由 fengye 于 2018-12-6 19:45 编辑 * 1,根据AT命令客户端应用笔记配置工程,测试AT Socket,bsp用的是stm32f10x,编译下载后串口打印信息如下: \ | / - RT - Thread Operating System / | \ 3.1.1 build Dec 5 2018 2006 - 2018 Copyright by rt-thread team [32m[I/SAL_SOC] Socket Abstraction Layer initialize success.[0m [32m[I/at.clnt] AT client(V1.2.0) on device uart3 initialize success.[0m msh >[31m[E/at.clnt] execute command (AT+RST) failed![0m [31m[E/at.esp8266] RT AT send commands(AT+RST) error![0m [31m[E/at.esp8266] AT network initialize failed (-1)![0m ,2,用串口监测是STM32串口3与8266通信,发现STM32指令的第一个字符没有发出来,如图: ![rst1.png](/uploads/201812/05/173458xbas3zz40z814n6z.png), 3,于是把AT Socket关闭,写了一个测试线程,把如下: void test_thread_entry(void* parameter) { rt_uint8_t uart_rx_data; /* 打开串口 */ if (uart_open("uart3") != RT_EOK) { rt_kprintf("uart open error.
"); while (1) { rt_thread_delay(10); } } /* 单个字符写 */ uart_putchar('2'); uart_putchar('0'); uart_putchar('1'); uart_putchar('8'); uart_putstring("
"); /* 写字符串 */ uart_putstring("Hello RT-Thread!
"); while (1) { /* 读数据 */ uart_rx_data = uart_getchar(); /* 错位 */ uart_rx_data = uart_rx_data + 1; /* 输出 */ uart_putchar(uart_rx_data); } } 打印结果如图:发现第一个字符没有发出来 ![uart.png](/uploads/201812/05/175436q2622szq2da21slv.png) 4,想起之前跑裸机时串口也遇到过这个问题,原因是配置完串口时,没有清发送完成标志, 于是在usart.c中的stm32_configure()函数中,加入 /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去 */ USART_ClearFlag(uart->uart_device, USART_FLAG_TC); /* 清发送完成标志,Transmission Complete flag */ static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_configure *cfg) { struct stm32_uart* uart; USART_InitTypeDef USART_InitStructure; RT_ASSERT(serial != RT_NULL); RT_ASSERT(cfg != RT_NULL); uart = (struct stm32_uart *)serial->parent.user_data; USART_InitStructure.USART_BaudRate = cfg->baud_rate; if (cfg->data_bits == DATA_BITS_8){ USART_InitStructure.USART_WordLength = USART_WordLength_8b; } else if (cfg->data_bits == DATA_BITS_9) { USART_InitStructure.USART_WordLength = USART_WordLength_9b; } if (cfg->stop_bits == STOP_BITS_1){ USART_InitStructure.USART_StopBits = USART_StopBits_1; } else if (cfg->stop_bits == STOP_BITS_2){ USART_InitStructure.USART_StopBits = USART_StopBits_2; } if (cfg->parity == PARITY_NONE){ USART_InitStructure.USART_Parity = USART_Parity_No; } else if (cfg->parity == PARITY_ODD) { USART_InitStructure.USART_Parity = USART_Parity_Odd; } else if (cfg->parity == PARITY_EVEN) { USART_InitStructure.USART_Parity = USART_Parity_Even; } USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(uart->uart_device, &USART_InitStructure); /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去 */ USART_ClearFlag(uart->uart_device, USART_FLAG_TC); /* 清发送完成标志,Transmission Complete flag */ /* Enable USART */ USART_Cmd(uart->uart_device, ENABLE); return RT_EOK; } 然后先通过串口先测试效果,如下图: ![usat.png](/uploads/201812/05/175859derc0qccdc7tzt17.png) 5,开启AT Socket功能,发现还是不行,第一个字母发不出来,是加的位置不对吗? 6,后面我在发送第一条指令时,多加一个字符,代码如下: static void esp8266_init_thread_entry(void *parameter) { at_response_t resp = RT_NULL; rt_err_t result = RT_EOK; rt_size_t i; resp = at_create_resp(128, 0, rt_tick_from_millisecond(5000)); if (!resp) { LOG_E("No memory for response structure!"); result = -RT_ENOMEM; goto __exit; } rt_thread_delay(rt_tick_from_millisecond(5000)); /* reset module */ AT_SEND_CMD(resp, "AAT+RST"); /* reset waiting delay */ rt_thread_delay(rt_tick_from_millisecond(1000)); /* disable echo */ AT_SEND_CMD(resp, "ATE0"); /* set current mode to Wi-Fi station */ AT_SEND_CMD(resp, "AT+CWMODE=1"); /* get module version */ AT_SEND_CMD(resp, "AT+GMR"); 模块就能正常连上网络,如图: ![succ.png](/uploads/201812/05/181212e6coq0o3zphl99zh.png) 有谁遇到过类似的问题,到底问题在哪里?看了一天代码了,硬是不知道到改哪里!望各位指点指点
查看更多
10
个回答
默认排序
按发布时间排序
armink
2018-12-06
这家伙很懒,什么也没写!
第一字节发送失败的问题挺常见
来一颗糖
2018-12-06
这家伙很懒,什么也没写!
[https://github.com/RT-Thread/rt-thread/pull/2039/files](https://github.com/RT-Thread/rt-thread/pull/2039/files) 已经修复,请等这个 PR 被合并,再试试。 :hug:
fengye
2018-12-06
这家伙很懒,什么也没写!
:Q我整了两天了:'(
fengye
2018-12-06
这家伙很懒,什么也没写!
>我整了两天了 --- 改好了,没问题了,我躲厕所哭一会去:'(
armink
2018-12-06
这家伙很懒,什么也没写!
新的改法如果有用,记得结贴哈
fengye
2018-12-06
这家伙很懒,什么也没写!
[i=s] 本帖最后由 fengye 于 2018-12-6 18:08 编辑 [/i] 总结:stm32f10x的BSP串口问题引起的,修改地方,usart.c中 1:static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_configure *cfg)函数 添加/* 清发送完成标志,Transmission Complete flag */ static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_configure *cfg) { struct stm32_uart* uart; USART_InitTypeDef USART_InitStructure; RT_ASSERT(serial != RT_NULL); RT_ASSERT(cfg != RT_NULL); uart = (struct stm32_uart *)serial->parent.user_data; USART_InitStructure.USART_BaudRate = cfg->baud_rate; if (cfg->data_bits == DATA_BITS_8){ USART_InitStructure.USART_WordLength = USART_WordLength_8b; } else if (cfg->data_bits == DATA_BITS_9) { USART_InitStructure.USART_WordLength = USART_WordLength_9b; } if (cfg->stop_bits == STOP_BITS_1){ USART_InitStructure.USART_StopBits = USART_StopBits_1; } else if (cfg->stop_bits == STOP_BITS_2){ USART_InitStructure.USART_StopBits = USART_StopBits_2; } if (cfg->parity == PARITY_NONE){ USART_InitStructure.USART_Parity = USART_Parity_No; } else if (cfg->parity == PARITY_ODD) { USART_InitStructure.USART_Parity = USART_Parity_Odd; } else if (cfg->parity == PARITY_EVEN) { USART_InitStructure.USART_Parity = USART_Parity_Even; } USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(uart->uart_device, &USART_InitStructure); /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去 */ USART_ClearFlag(uart->uart_device, USART_FLAG_TC); /* 清发送完成标志,Transmission Complete flag */ /* Enable USART */ USART_Cmd(uart->uart_device, ENABLE); return RT_EOK; } 2:static int stm32_putc(struct rt_serial_device *serial, char c)函数 添加/* 清发送完成标志,Transmission Complete flag */ static int stm32_putc(struct rt_serial_device *serial, char c) { struct stm32_uart* uart; RT_ASSERT(serial != RT_NULL); uart = (struct stm32_uart *)serial->parent.user_data; if (serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX) { if (!(uart->uart_device->SR & USART_FLAG_TXE)) { USART_ITConfig(uart->uart_device, USART_IT_TC, ENABLE); return -1; } uart->uart_device->DR = c; USART_ITConfig(uart->uart_device, USART_IT_TC, ENABLE); } else { /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去 */ USART_ClearFlag(uart->uart_device,USART_FLAG_TC); uart->uart_device->DR = c; while (!(uart->uart_device->SR & USART_FLAG_TC)); } return 1; } 结贴
fengye
2018-12-06
这家伙很懒,什么也没写!
>新的改法如果有用,记得结贴哈 --- 怎么结贴呀?
armink
2018-12-06
这家伙很懒,什么也没写!
改下标题,说明下原因及结果
admin
2018-12-09
这家伙很懒,什么也没写!
测试
denglongbing
2019-09-11
这家伙很懒,什么也没写!
[i=s] 本帖最后由 denglongbing 于 2019-9-11 10:39 编辑 [/i] 谢谢楼主的分享!
撰写答案
登录
注册新账号
关注者
0
被浏览
3.2k
关于作者
fengye
这家伙很懒,什么也没写!
提问
3
回答
38
被采纳
0
关注TA
发私信
相关问题
1
rt thread 2.0.2 usart 接收缓存问题
2
关于STM32串口通信的问题
3
STM32F1+RTT串口接收终端数据丢失问题
4
UART TX丢数据?
5
RTT打开串口的时候如何自定义波特率呢?
6
STM32F4的USART数据接收问题
7
串口1234使用问题
8
串口接收回调函数
9
LPC18xx UART问题讨论
10
x1000串口配置的失败问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
GD32F450 片内 flash驱动适配
2
STM32H7R7运行CherryUSB
3
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
4
使用RC522软件包驱动FM1722
5
常量数据类型和表达式陷阱分享
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部