OpenEdv-开源电子网

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

串口发送数据中断函数的问题

[复制链接]

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-16
在线时间
0 小时
发表于 2015-6-2 19:03:21 | 显示全部楼层 |阅读模式
5金钱
我自己编了一个串口发送数据的函数放在串口1的中断服务函数里了,但是程序完在执行发送一帧数据后触摸屏没有反应(用JTAG调试,STM32串口与触摸屏串口连接),不知道是不是我发送中断函数写错了,请大家帮忙看一看。我用的是USART_SR的第六位,也就是TC来使能发送中断,就是每次要发送一帧数据时,现在主程序中把第一个字节发送出去,触发发送中断,再在中断函数里发送剩余部分,中断函数的代码如下,大家帮忙看看是不是哪里有问题?t的初始值为1,一帧数据固定8个字节,由于主程序中已经发送出一个字节,所以中断函数中需要发送7个字节
 if (USART1->SR&(1<<6))
{
  if(t<=7)
  {
    USART1->DR=USART_TX_BUF[t];
    t++;
  }else
  {
    USART1->SR|=0<<6;//状态寄存器发送完成标志位清零
    t=1;
  } 
}

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

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2015-6-2 19:17:56 | 显示全部楼层
STM32串口与触摸屏串口连接???
没看懂
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-16
在线时间
0 小时
 楼主| 发表于 2015-6-2 19:44:29 | 显示全部楼层
回复【2楼】login_FAE:
---------------------------------
就是串口通信实现单片机对屏显示的控制
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-6-2 19:56:14 | 显示全部楼层
在串口接收中断里用串口发数据了?这样不太好
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-16
在线时间
0 小时
 楼主| 发表于 2015-6-2 20:48:18 | 显示全部楼层
回复【4楼】as564335sa:
---------------------------------
不是串口1的中断都要写在这个函数里吗?如果不这样写应该怎么写呢?求教
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-6-3 08:58:12 | 显示全部楼层
没太看懂你要做什么,你是要用串口发数?直接发不就行了,你开了发送中断?
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-16
在线时间
0 小时
 楼主| 发表于 2015-6-3 09:40:38 | 显示全部楼层
回复【6楼】as564335sa:
---------------------------------
恩     就是串口发数据,数据是已知的,我用了中断;直接发是用printf还是fputc写呢,具体要怎么写?基础比较差所以还请多多指教。。。
回复

使用道具 举报

3

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-5-29
在线时间
0 小时
发表于 2015-6-3 09:52:03 | 显示全部楼层
if (USART1->SR&(1<<6))
 {
   //在这里就要清标置了,每发一个字节就要清一次
   USART1->SR|=0<<6;//状态寄存器发送完成标志位清零
   if(t<=7)
   {
     USART1->DR=USART_TX_BUF[t];
     t++;
   }
    /*
    else
   {
     
    t=1;
   } 
   */
 }
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-6-3 10:03:44 | 显示全部楼层
直接发就是往寄存器里填数然后等标志位啊
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-16
在线时间
0 小时
 楼主| 发表于 2015-6-3 10:09:04 | 显示全部楼层
回复【8楼】XCDesigner:
---------------------------------
我看《例说STM32》里面讲TC可以通过先读USART_SR,再写USART_DR清零,那么程序里USART1->SR&(1<<6)这一句是不是就相当于读USART_SR,USART1->DR=USART_TX_BUF[t]这一句就相当于USART1->DR=USART_TX_BUF[t]?所以我理解的是每次进中断以后把一个字节写到DR里时已经清掉了TC标志位,这个字节在DR中发送完成后TC又被置1,所以不用 USART1->SR|=0<<6来强制清零。我理解的是不是有问题?
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-16
在线时间
0 小时
 楼主| 发表于 2015-6-3 10:14:17 | 显示全部楼层
回复【9楼】as564335sa:
---------------------------------
for(t=0;t<len;t++)
{
    USART1-DR=USART_RX_BUF[t];
    while((USART1->SR&0x40)==0);//等待发送结束
}
是类似于这样吗?
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-6-3 12:17:44 | 显示全部楼层
回复【11楼】尖尖坚的果:
---------------------------------
对啊
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-16
在线时间
0 小时
 楼主| 发表于 2015-6-3 12:26:32 | 显示全部楼层
回复【12楼】as564335sa:
---------------------------------
现在我用串口发送数据,在虚拟串口软件中把电脑的串口1和串口2连到了一起,在keil中把电脑的串口2和单片机的串口1进行了绑定。然后运行程序,用串口调试助手查看串口1的状态,可是出现的都是乱码,不知道为什么呀
定义的数据串例如:  char str0[8]={0xA5,0x5A,0x05,0x82,0x00,0x60,0x00,0x01};
因为要发送很多次数据,所以我把串口发送数据的程序封装成了下面这个函数,每次使用调用一下
void SEND_1(char *stra)
  {
     u8 i;
     for(i=0;i<strlen(stra);i++)
    {
        USART1->DR=stra;
        while((USART1->SR&0X40)==0);
     }
  }

主程序中发送str0:
SEND_1(str0);
我的程序有问题吗?
回复

使用道具 举报

3

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-5-29
在线时间
0 小时
发表于 2015-6-3 22:20:16 | 显示全部楼层
你仔细看看我程序和你的程序区别,你清除是在t >7之后才清,而我的代码是每次都清除。
回复

使用道具 举报

3

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-5-29
在线时间
0 小时
发表于 2015-6-3 22:22:49 | 显示全部楼层
USART1->SR|=0<<6;
清除好像是
USART1->SR &= ~(1<<6);
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-6-4 08:24:53 | 显示全部楼层
回复【13楼】尖尖坚的果:
---------------------------------
str开头的库函数遇到'\0'即0x00就结束
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-16
在线时间
0 小时
 楼主| 发表于 2015-6-6 19:31:42 | 显示全部楼层
回复【16楼】as564335sa:
---------------------------------
那要怎么改呢?
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-6-7 21:00:24 | 显示全部楼层
回复【17楼】尖尖坚的果:
---------------------------------
自己定长
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 14:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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