OpenEdv-开源电子网

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

关于串口中断使用指针接收字符串的问题

[复制链接]

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
发表于 2015-1-28 14:22:42 | 显示全部楼层 |阅读模式
5金钱

我使用串口助手,发送数据给STM32,触发接收中断,我想把接收的数据存到字符串指针中,再把字符串指针中的数据发送到串口,对比是否一致。

出现的问题是,编译没有出错,但是在串口助手发送数据,接受区没有数据。中断的配置,端口配置都已经设置好了的,时钟也设置好。


char *reData;
char temp_trx;


void threeGmodel_sendOnebyte(char data)
{
  USART_SendData(USART1,data);
  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}

void threeGmodel_sendStringbyte(char* str)
{
 while(*str)
 { 
  threeGmodel_sendOnebyte(*str); 
  delay();
  str++;
 } 
 delay();
}



void USART1_IRQHandler(void)   
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
  temp_trx = USART_ReceiveData(USART1); 
  *reData = temp_trx ;
  threeGmodel_sendOnebyte(*reData);
  reData++;  
  //threeGmodel_sendOnebyte(temp_trx);
 }

}

感觉代码是没有错的,不知道是不是数据之间的问题,求高人指点!

最佳答案

查看完整内容[请看2#楼]

回复【3楼】Fong0716: --------------------------------- 指针不是这么用的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-1-28 14:22:43 | 显示全部楼层
回复【3楼】Fong0716:
---------------------------------
指针不是这么用的。
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2015-1-28 14:22:43 | 显示全部楼层
*reData没初始化,是野指针。而且这样用就不对,建个数组,先准备好空间,再把收到的数据往里面放,用字符串指针一个一个指,最后结尾放个“0”就可以了
博观而约取,厚积而薄发。
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2015-1-28 14:34:23 | 显示全部楼层
你仿真试试temp_trx没数据的话可能是配置问题
博观而约取,厚积而薄发。
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 14:45:44 | 显示全部楼层
回复【2楼】745021926:
---------------------------------
仿真看DR寄存器吗? 具体操作是如何,只知道仿真后,接收数据,可以在USRST端口看到
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 14:50:43 | 显示全部楼层
回复【2楼】745021926:
---------------------------------
void USART1_IRQHandler(void)    
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
temp_trx = USART_ReceiveData(USART1);
// *reData = temp_trx ;
// threeGmodel_sendOnebyte(*reData);
// reData++;
threeGmodel_sendOnebyte(temp_trx);
}

}
若是这么的话,我在串口助手发送abcdefg,接收区是可以一次性接收的,但是之前的代码感觉是指针的问题,可能导致出错,但是具体的原因也不知道为什么会这么,也没有头绪如何修改
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 14:57:22 | 显示全部楼层
回复【5楼】TinyBoy:
---------------------------------
啊,那该如何使用。。。
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 15:00:13 | 显示全部楼层
回复【5楼】TinyBoy:
---------------------------------
能具体说说方法吗,感觉没错啊。。。。
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 15:03:11 | 显示全部楼层
回复【5楼】TinyBoy:
---------------------------------
threeGmodel_sendStringbyte("ATD*99#");我程序这么写法来发送也可以啊
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-1-28 15:05:48 | 显示全部楼层
回复【7楼】Fong0716:
---------------------------------
接受区没有数据,你是怎么样查看?是没有数据,还是数据不对?
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2015-1-28 15:06:21 | 显示全部楼层
哦,刚看到,你这是个字符型指针,加一怎么操作,用字符串指针
博观而约取,厚积而薄发。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-1-28 15:08:31 | 显示全部楼层
回复【8楼】Fong0716:
---------------------------------
threeGmodel_sendStringbyte("ATD*99#");这样发送当然可以啊,难道有疑问么?
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 15:09:25 | 显示全部楼层
回复【9楼】TinyBoy:
---------------------------------
没有数据,接受区没有数据。

  

我使用串口助手,发送数据给STM32,触发接收中断,我想把接收的数据存到字符串指针中,再把字符串指针中的数据发送到串口,对比是否一致。 

出现的问题是,编译没有出错,但是在串口助手发送数据,接受区没有数据。中断的配置,端口配置都已经设置好了的,时钟也设置好。 




char *reData;
 char temp_trx; 




void threeGmodel_sendOnebyte(char data)
 {
   USART_SendData(USART1,data);
   while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
 } 

void threeGmodel_sendStringbyte(char* str)
 {
  while(*str)
  { 
   threeGmodel_sendOnebyte(*str); 
   delay();
   str++;
  } 
  delay();
 } 







void USART1_IRQHandler(void)    
 {
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
   {
   temp_trx = USART_ReceiveData(USART1); 
   *reData = temp_trx ;
   threeGmodel_sendOnebyte(*reData);
   reData++;  
   //threeGmodel_sendOnebyte(temp_trx);
  } 

}
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-1-28 15:10:22 | 显示全部楼层
回复【7楼】Fong0716:
---------------------------------
还是说明你没搞懂指针的用法,看下书,多理解下指针的用法吧。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-1-28 15:17:09 | 显示全部楼层
回复【12楼】Fong0716:
---------------------------------
没有数据?你这样使用指针,应该也可以发送数据,只是这样用,可能会有不可预知的后果。
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 15:22:23 | 显示全部楼层
回复【14楼】TinyBoy:
---------------------------------
程序死在 *reData = temp_trx ;这一句 
字符串指针指在字符串第一个字符的地址,我这么用的确是不怎么对。。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-1-28 15:27:24 | 显示全部楼层
回复【15楼】Fong0716:
---------------------------------
本来就不应该这么用 ,你改改,再试试。
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 15:44:02 | 显示全部楼层
回复【16楼】TinyBoy:
---------------------------------
感谢你指出我的问题!
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 15:46:58 | 显示全部楼层
回复【17楼】745021926:
---------------------------------
也感谢你的方法!!
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 16:42:22 | 显示全部楼层
回复【16楼】TinyBoy:
---------------------------------
void threeGmodel_sendOnebyte(char data)
{
USART_SendData(USART1,data);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}

void threeGmodel_sendStringbyte(char* str)
{
while(*str)
{
threeGmodel_sendOnebyte(*str);
delay();
str++;
}
delay();
}

void USART1_IRQHandler(void)    
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
temp_trx = USART_ReceiveData(USART1);
  reData = &temp_trx;
threeGmodel_sendOnebyte(*reData);
                i++;
if(i==3)
{
threeGmodel_sendStringbyte(reData);
}
}
}
改成这么字针数组单个字符读的数据没有问题,列如我发abcd,读出来也一样,但是读threeGmodel_sendStringbyte(reData);返回的数据就不正确了。。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-1-28 17:04:59 | 显示全部楼层
回复【20楼】Fong0716:
---------------------------------
reData是怎样定义的?
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 19:13:04 | 显示全部楼层
回复【21楼】TinyBoy:
---------------------------------
char *reData[256];
回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
 楼主| 发表于 2015-1-28 21:42:35 | 显示全部楼层
回复【21楼】TinyBoy:
---------------------------------
解决了。还是自己对指针的用法不熟识,想当然了。= =
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 07:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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