Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
AT Socket中的串口问题,原因已经找到,usart.c问题,如下
发布于 2018-12-05 18:16:08 浏览:3277
订阅该版
* 本帖最后由 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), 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); } } 打印结果如图:发现第一个字符没有发出来  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; } 然后先通过串口先测试效果,如下图:  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"); 模块就能正常连上网络,如图:  有谁遇到过类似的问题,到底问题在哪里?看了一天代码了,硬是不知道到改哪里!望各位指点指点
查看更多
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.3k
关于作者
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
求助can通讯下怎末运用485
2
STM32F407ZGT适配串口V2驱动
3
【CFP】2025 RT-Thread全球技术大会演讲征集开始啦!
4
在 RT-Thread Studio 环境中为 ART-Pi 2 移植 CherryUSB(以 usb_device 为例)
5
嵌入式ARM RISCV toolchain工具 梳理arm-none-eabi-gcc
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
cubemx
ESP8266
WIZnet_W5500
UART
ota在线升级
BSP
PWM
flash
packages_软件包
freemodbus
潘多拉开发板_Pandora
ADC
GD32
定时器
flashDB
编译报错
keil_MDK
socket
中断
rt_mq_消息队列_msg_queue
Debug
ulog
SFUD
msh
C++_cpp
at_device
本月问答贡献
聚散无由
9
个答案
6
次被采纳
RTT_逍遥
8
个答案
2
次被采纳
a1012112796
5
个答案
2
次被采纳
三世执戟
4
个答案
2
次被采纳
加缪
2
个答案
2
次被采纳
本月文章贡献
wake_mirco
2
篇文章
7
次点赞
mushroom
1
篇文章
9
次点赞
张世争
1
篇文章
7
次点赞
RTT_逍遥
1
篇文章
5
次点赞
Jack_____
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部