9073|14

91

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】中断接收 [复制链接]

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{unsigned int j;
for(j=0;j<=1;j++)
temp[j]=RXBUF0;
flag=1;
}

请问这样temp能接受到两个字符吗

还有串口助手如何连续发送若干个字符啊
谢谢各位帮忙,很急啊

最新回复

引用: #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx(void) {do { temp[j]=RXBUF0; j++; }while(j==2); flag=1; } 发送0201还是只接收01,temp[1]默认为00了 怎么办啊 是我串口助手的问题吗 点发送数据0201计数显示加只1 用别的倒是加2,不过结果是一样的 你这个接收程序有问题。 首先,每次中断从RXBUF0接收缓冲区读数据,需要判通讯口是否完成接收。 其次,取完RXBUF0的数据后,只需要将下标变量加1后就退出中断程序,回到主程序(被中断处)中等待下一次中断。 所以,while循环等待j等于2后设置flag=1没有必要。改成这样: #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx(void) { while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready? temp[j]=RXBUF0; j++; if (j ==2) flag=1; }  详情 回复 发表于 2006-4-27 18:45
 
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1、不行,430的串口接收中断每次只能接受一字节(即一个字符),n个字符必须n次中断。
2、串口助手连续发送若干个字符只需要在发送窗口连续写入你需要发送的内容,即字符串形式(不需要加任何分隔符)。点击“发送”按钮就可以将整个字符串发送出去了。
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢师兄
那430要是接收一串字符命令不是很麻烦吗
要是不知道接收的字符有几个怎么办啊

n次中断要连着写吗
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
Error[Pe247]: function "usart0_rx" has already been defined
好像不可以啊
出现了上面的错误信息
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
也不麻烦。你只要定义一个全局变量作为接收数组的下标,每次收到数据后将该变量加1,就可以将一连串的数据放到接收数组中了。

中断程序只要一个。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
temp[j]=RXBUF0;
j++;
}

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
temp[j]=RXBUF0;
flag=1;
}
这是程序
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

7
 
不是你这样的。应该这样:
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
temp[flag]=RXBUF0;
flag++;//flag是全局变量
}
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
temp[j]=RXBUF0;
j++;
flag=1;
}

这样也是接收一个啊
程序对吗
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
j是全局变量吗?
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用:

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
temp[j]=RXBUF0;
j++;
flag=1;
}

这样也是接收一个啊
程序对吗
如果j变量是全局专用变量的话,n次中断后,temp数组中就连续存放着通讯口连续接收到的数据了。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
住程序中我已经把j清零了
但是如果我发送十六进制0102,好像不是temp[0]存02,temp[1]存01
都存在了temp[0]里面
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
j 是全局变量
flag是标志位
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用:

j 是全局变量
flag是标志位
j 不仅要是全局变量,还要是接收数据专用,在整个数据帧接收完成前,其它地方不要改变其内容。换一个有意义的变量名吧,专用变量的名字不要这么通用和无意义。
这样便于程序维护,一看就知道是什么用途。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

14
 
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{do
{
temp[j]=RXBUF0;
j++;
}while(j==2);
flag=1;
}
发送0201还是只接收01,temp[1]默认为00了
怎么办啊
是我串口助手的问题吗
点发送数据0201计数显示加只1
用别的倒是加2,不过结果是一样的
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用:

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{do
{
temp[j]=RXBUF0;
j++;
}while(j==2);
flag=1;
}
发送0201还是只接收01,temp[1]默认为00了
怎么办啊
是我串口助手的问题吗
点发送数据0201计数显示加只1
用别的倒是加2,不过结果是一样的
你这个接收程序有问题。
首先,每次中断从RXBUF0接收缓冲区读数据,需要判通讯口是否完成接收。
其次,取完RXBUF0的数据后,只需要将下标变量加1后就退出中断程序,回到主程序(被中断处)中等待下一次中断。
所以,while循环等待j等于2后设置flag=1没有必要。改成这样:

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready?
temp[j]=RXBUF0;
j++;
if (j ==2) flag=1;
}
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表