OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9026|回复: 9

关于PC机与stm32串口通讯的一个小疑惑,总是想不明白

[复制链接]

25

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2012-8-7
在线时间
1 小时
发表于 2012-10-24 10:33:52 | 显示全部楼层 |阅读模式

下面是我代码的一部分,实现的功能很简单,就是用串口小助手给单片机发一个数据,单片机不断查询接收,一旦接收马上返回原数据给电脑:

/* Private variables ---------------------------------------------------------*/
 USART_InitTypeDef USART_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;

/* Private functions ---------------------------------------------------------*/
void rcc_cfg()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
}

void gpio_cfg()
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;        //configure PA9  as TX and PA10 as RX
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void usart_cfg()
{
 USART_InitStructure.USART_BaudRate = 115200;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 USART_InitStructure.USART_Parity = USART_Parity_No;
 USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

 USART_Init(USART1,&USART_InitStructure);
 USART_Cmd(USART1, ENABLE);
}

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */    


  /* Add your application code here
     */
  uint16_t data;
  rcc_cfg();
  gpio_cfg();
  usart_cfg();
  /* Infinite loop */
  while (1)
  {
  while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);  //wait until USART_FLAG_RXNE=RESET

  data=USART_ReceiveData(USART1);

  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);  // wait until USART_FLAG_TXE=RESET

  USART_SendData(USART1,data);
  }
}

我的问题是,按我的理解,单片机每次应该只能接受最多两字节的数据吧,因为我定义的数据缓存为 uint16_t data,可是,我在串口调试工具里一次性发送连续的字符串,单片机也返回连续的字符串,是不是挺诡异?比如,我发送hello,马上就能收到hello。莫非,电脑给串口发送字符串是单个单个发送出去而不是一次性连续发送?
其实知道这个问题比较水,但想了很久都没明白,求前辈们解释解释!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
发表于 2012-10-24 10:44:17 | 显示全部楼层
LZ,你好,我把你程序弄到我板子上,咋单片机不返回数据呢?
     我最近也到学习串口,我自己的程序配置和你都一样,可是也收不到数据,不知道怎么回事
回复 支持 反对

使用道具 举报

25

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2012-8-7
在线时间
1 小时
 楼主| 发表于 2012-10-24 11:18:26 | 显示全部楼层
回复【2楼】颓废ю小寶:
---------------------------------
不会吧,我不知道你是用的什么板子。如果你是用的mini板,那建议你先用光盘自带的例程检测一下,看问题是否出在你的电脑硬件或者是那个串口助手软件上,光盘带的例程是肯定可以运行的,如果不能运行,有可能是你的PC机串口坏了,或者是你那个串口调试软件不行,换个试试
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-24 11:31:23 | 显示全部楼层
回复【楼主位】草尼玛:
---------------------------------
你是不是直接把TXD和RXD短路了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2012-8-7
在线时间
1 小时
 楼主| 发表于 2012-10-24 11:44:43 | 显示全部楼层
回复【4楼】正点原子:

---------------------------------
没有短路啊,跳帽链接正常,PA9连RXD,PA10连TXD
回复 支持 反对

使用道具 举报

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
发表于 2012-10-24 13:26:59 | 显示全部楼层
我的是mini板,而且板子也是正常的,我用历程试过了,可以正常发送,但是我自己的程序里面好像是正常的,但却不能正常发送。然后我把你的程序改到我程序里面,也不能正常发送和接收。
   我是 A9----RXD
             A10---TXD
这个接法的。
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-11-14
在线时间
0 小时
发表于 2014-5-20 18:29:51 | 显示全部楼层
我也有同样的疑惑,楼下跑题了啊。。。。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-5-20
在线时间
0 小时
发表于 2014-5-20 23:08:45 | 显示全部楼层
串口,顾名思义,一个bit一个bit串行发送呀。

USART_ReceiveData每次只返回一个字节,系统有缓存。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-20 23:24:14 | 显示全部楼层
回复【6楼】颓废ю小寶:
---------------------------------
仿真,对比下串口寄存器(同我们例程对比).
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2014-11-9
在线时间
5 小时
发表于 2014-12-6 17:25:45 | 显示全部楼层
我也郁闷,问下,对于串口,那个定义的数组USART_RX_BUF[USART_REC_LEN],例程说一次定义USART_REC_LEN为200,怎么理解,到底发送数据怎么算,求解答
加油,奋斗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 06:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表