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

关于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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版