你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM32F030F4P6 串口接收发送问题

[复制链接]
su-409464 提问时间:2018-3-7 08:52 /
做了一个 STM32的串口模块, 开启了接收中断, 在中断中做了以下操作,
想实现: 将串口接收的内容 通过串口再发出去
  1. <div> void USART1_IRQHandler(void)
  2. {
  3.   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  4.   {
  5.     USART1_SendByte((uint8_t)(USART1->RDR));     
  6.   }</div><div>}
  7. </div>
复制代码


测试了 普通英文字符 ,都是正常的。

但是小括号符 就不行,程序就死掉了 ,例如    aaa(2,2“”)

串口输出 aaa(    然后就死了~~~~


请问 小括号符 不能接收吗??


收藏 评论22 发布时间:2018-3-7 08:52

举报

22个回答
废鱼 回答时间:2018-3-7 11:10:22
普通的串口接收就一个字节
废鱼 回答时间:2018-3-7 09:30:48
在这之后发什么都不回复了是吗?如果是,可能是因为串口溢出导致,接收中断中要处理一下溢出。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

su-409464 回答时间:2018-3-7 10:55:50
toofree 发表于 2018-3-7 09:37
不能够。都能发。
不过,如果像你主楼帖子发的小括号的话,那是全角符号,占两个字节。
请区分"("和"(", ...

可能是溢出了!!!
初次配置, 不知道 串口的接收区如何设置, 没有配置到,

  1. void USART_Configuration(void)
  2. {
  3.   USART_InitTypeDef USART_InitStructure;

  4.   /******************************************************************
  5.   USART²ÎÊý³õʼ»¯:  ²¨ÌØÂÊ     ´«ÊäλÊý   Í£Ö¹Î»Êý  Ð£ÑéλÊý
  6.                     115200         8         1        0(NO)
  7.   *******************************************************************/
  8.   USART_InitStructure.USART_BaudRate = 115200;                       //É趨´«ÊäËÙÂÊ
  9.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //É趨´«ÊäÊý¾ÝλÊý
  10.   USART_InitStructure.USART_StopBits = USART_StopBits_1;             //É趨ֹͣλ¸öÊý
  11.   USART_InitStructure.USART_Parity = USART_Parity_No ;               //²»ÓÃУÑéλ
  12.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//²»ÓÃÁ÷Á¿¿ØÖÆ
  13.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //ʹÓýÓÊպͷ¢Ë͹¦ÄÜ
  14.   USART_Init(USART1, &USART_InitStructure);                          //³õʼ»¯USART1

  15.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                     //ʹÄÜUSART1½ÓÊÕÖжÏ

  16.   USART_Cmd(USART1, ENABLE);                                         //ʹÄÜUSART1
  17. }
复制代码

anobodykey 回答时间:2018-3-7 09:19:46
不会的,串口是不区分字符的,你输入一长串英文字符看看

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

琦子 回答时间:2018-3-7 09:37:04
楼主你好,这个情况我也没有遇到过,你试试发送)看不会回当掉啊 还有就是(和2之间没有空格吧 还可是试试写一个字符串就是用“222”缀上“(”,发送试试

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

七哥 回答时间:2018-3-7 09:37:36
本帖最后由 toofree 于 2018-3-7 09:46 编辑

不能够。都能发。
不过,如果像你主楼帖子发的小括号的话,那是全角符号,占两个字节。
请区分"("和"(",这两个是不一样的。

傲游截图20180307093536.png

傲游截图20180307093612.png


你的程序只适合一个字节一个字节的发,不能两个字节一起发。就是说两个字节发送之间,得有一定的延时。
或者写成,中断中接收字符到数组,主程序中发送。发送不能影响接收中断。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

su-409464 回答时间:2018-3-7 10:53:55
anobodykey 发表于 2018-3-7 09:19
不会的,串口是不区分字符的,你输入一长串英文字符看看

好像真的是 溢出了~~~
几个字符可以,但是一长串 字符就 挂了!!!!

请问 默认 串口的接收区 是多大?

void USART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;
  /******************************************************************
  USART²ÎÊý³õʼ»¯:  ²¨ÌØÂÊ     ´«ÊäλÊý   Í£Ö¹Î»Êý  Ð£ÑéλÊý
                    115200         8         1        0(NO)
  *******************************************************************/
  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_HardwareFlowControl = USART_HardwareFlowControl_None;//²»ÓÃÁ÷Á¿¿ØÖÆ
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //ʹÓýÓÊպͷ¢Ë͹¦ÄÜ
  USART_Init(USART1, &USART_InitStructure);                          //³õʼ»¯USART1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                     //ʹÄÜUSART1½ÓÊÕÖжÏ
  USART_Cmd(USART1, ENABLE);                                         //ʹÄÜUSART1
}
su-409464 回答时间:2018-3-7 10:54:57
安 发表于 2018-3-7 09:30
在这之后发什么都不回复了是吗?如果是,可能是因为串口溢出导致,接收中断中要处理一下溢出。 ...

是的,可能是溢出了, 我配置串口的时候 只设置了一些普通的常数, 不知道默认的串口接收区是多大?

  1. void USART_Configuration(void)
  2. {
  3.   USART_InitTypeDef USART_InitStructure;

  4.   /******************************************************************
  5.   USART²ÎÊý³õʼ»¯:  ²¨ÌØÂÊ     ´«ÊäλÊý   Í£Ö¹Î»Êý  Ð£ÑéλÊý
  6.                     115200         8         1        0(NO)
  7.   *******************************************************************/
  8.   USART_InitStructure.USART_BaudRate = 115200;                       //É趨´«ÊäËÙÂÊ
  9.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //É趨´«ÊäÊý¾ÝλÊý
  10.   USART_InitStructure.USART_StopBits = USART_StopBits_1;             //É趨ֹͣλ¸öÊý
  11.   USART_InitStructure.USART_Parity = USART_Parity_No ;               //²»ÓÃУÑéλ
  12.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//²»ÓÃÁ÷Á¿¿ØÖÆ
  13.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //ʹÓýÓÊպͷ¢Ë͹¦ÄÜ
  14.   USART_Init(USART1, &USART_InitStructure);                          //³õʼ»¯USART1

  15.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                     //ʹÄÜUSART1½ÓÊÕÖжÏ

  16.   USART_Cmd(USART1, ENABLE);                                         //ʹÄÜUSART1
  17. }
复制代码
su-409464 回答时间:2018-3-7 10:56:24
bargagebaobei 发表于 2018-3-7 09:37
楼主你好,这个情况我也没有遇到过,你试试发送)看不会回当掉啊 还有就是(和2之间没有空格吧 还可是试试 ...

谢谢你, 可能是溢出了!正在查看默认串口接收区是多大
hello_bug 回答时间:2018-3-7 11:03:47
串口的接收缓冲区应该是自己定义的一个数组之类的变量;看看实际应用时最大一次性能发多少字节,然后设定个最大值;每次接收完后,处理后,要清空接收字节数变量。
发字符是没问题的,在英文输入状态下。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

anobodykey 回答时间:2018-3-7 11:17:53
su-409464 发表于 2018-3-7 10:53
好像真的是 溢出了~~~
几个字符可以,但是一长串 字符就 挂了!!!!

ST的串口没有硬件缓存区,你得用软件实现,譬如申请一个100字节的缓存区,在中断中把收到的数据放到缓存中,在主函数中进行回显操作,论坛里有很多这样的例程的
su-409464 回答时间:2018-3-7 11:20:20
安 发表于 2018-3-7 11:10
普通的串口接收就一个字节

好的谢谢!
su-409464 回答时间:2018-3-7 11:28:53
anobodykey 发表于 2018-3-7 11:17
ST的串口没有硬件缓存区,你得用软件实现,譬如申请一个100字节的缓存区,在中断中把收到的数据放到缓存 ...

好的明白!
这样的话 关于软件缓存的动作我就有一个 疑问;

首选由于 ST 没有硬件缓存区,那么意味着 接收到一个完整的字节 后  中断触发。

中断触发后,串口是否还在工作呢?
比如发送端发过来 一个20字节的字符, 收到第一个字符之后 开始进入中断,

后面19个字符 是等中断出来, 然后下一个字节接收 触发中断 ,再进入中断接收?
还是, 在第一个字节进入中断后, 串口继续工作,后面的字符继续  “收” 进来?

如果是第二种情况 那么, 如果 发送端是不定时的话, 那软件上做缓存  会不会 出现 “断节” 的现象

比如 缓存区15个字节, 第一次 来了10个字符, 接收过程中又来了10个~~~ 只收后一个包的5个字符
废鱼 回答时间:2018-3-7 11:42:29
中断产生后需要自己去把数据收到缓冲区,如果不收,这样就容易导致溢出。所有处理都是自己写代码解决。如果用DMA就不需要管理,接收到指定数量后会产生DMA中断。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版