msp430单片机UART接收字符串的问题
我现在需要通过串口接收无线模块发来的短信:字符串(很长),而且长短未知,还需要判断串口接收的是否为短信(指令:+CMT)因为可能会有其他指令的干扰所以必须判断,如果进一次...
我现在需要通过串口接收无线模块发来的短信:字符串(很长),而且长短未知,还需要判断串口接收的是否为短信(指令:+CMT)因为可能会有其他指令的干扰所以必须判断,如果进一次中断接收一个字节然后同时判断的话,就没有对数据的判断时间了,如果要是先接收再判断呢又不知道什么时候短信结束(因为会有其它的数据),现在我想的解决方案是:能不能在串口中断程序中连续接收字符串,不出中断,这样是不是会节省时间?或者有其他的什么方法能解决的,请说一说,不胜感激!!!!
短息的格式:
+CMT: "86号码",,"12/04/24,14:44:11+32",145,4,0,0,"8612700100600",145,2
gg
其中gg是我需要的数据。在gg之前有个回车0D 0A在gg后面也有个0D0A这个可以作为判断短信结束的标志,但是由于处理时间必须短,中断程序一点都不能长。
+CMT: "号码",,"12/04/24,14:44:11+32",145,4,0,0,"8612700100600",145,20D0Agg0D0A,这是短信格式,两个0D0A之间的gg代表我想要的数据,整个数据是没有停止位的,只有起始位+CMT,通过判断0D0A来看是不是停止了,但是其他没用的数据也会有这两个0D0A,或者说有什么办法能判断?中断程序:
//UART1接收中断服务程序,这是判断起始位+CMT的程序,但是不能用,因为太长了,时间不够。
#pragma vector = USCIAB1RX_VECTOR
__interrupt void UART1_RX_ISR(void)
{
if(message_num0 == 0)//+
{
if(message_temp_data == 0x2B)
{
message_num0++;
}
}
else if(message_num0 == 1)//C
{
if(message_temp_data == 0x43)
{
message_num0++;
}
else
{
message_num0 = 0;
}
}
else if(message_num0 == 2)//M
{
if(message_temp_data == 0x4D)
{
message_num0++;
}
else
{
message_num0=0;
}
}
else if(message_num0 == 3)//T
{
if(message_temp_data == 0x54)
{
message_num0++;
}
else
{
message_num0=0;
}
}
else if(message_num0 == 4)
{
if(message_temp_data ==0x0A)
{
message_num0++;
}
}
} 展开
短息的格式:
+CMT: "86号码",,"12/04/24,14:44:11+32",145,4,0,0,"8612700100600",145,2
gg
其中gg是我需要的数据。在gg之前有个回车0D 0A在gg后面也有个0D0A这个可以作为判断短信结束的标志,但是由于处理时间必须短,中断程序一点都不能长。
+CMT: "号码",,"12/04/24,14:44:11+32",145,4,0,0,"8612700100600",145,20D0Agg0D0A,这是短信格式,两个0D0A之间的gg代表我想要的数据,整个数据是没有停止位的,只有起始位+CMT,通过判断0D0A来看是不是停止了,但是其他没用的数据也会有这两个0D0A,或者说有什么办法能判断?中断程序:
//UART1接收中断服务程序,这是判断起始位+CMT的程序,但是不能用,因为太长了,时间不够。
#pragma vector = USCIAB1RX_VECTOR
__interrupt void UART1_RX_ISR(void)
{
if(message_num0 == 0)//+
{
if(message_temp_data == 0x2B)
{
message_num0++;
}
}
else if(message_num0 == 1)//C
{
if(message_temp_data == 0x43)
{
message_num0++;
}
else
{
message_num0 = 0;
}
}
else if(message_num0 == 2)//M
{
if(message_temp_data == 0x4D)
{
message_num0++;
}
else
{
message_num0=0;
}
}
else if(message_num0 == 3)//T
{
if(message_temp_data == 0x54)
{
message_num0++;
}
else
{
message_num0=0;
}
}
else if(message_num0 == 4)
{
if(message_temp_data ==0x0A)
{
message_num0++;
}
}
} 展开
展开全部
每太搞明白你的意思,不过我想。
1.就算你用某种方式不出中断然后连续接收字散皮符串,那么在这个中断子程内你也一定搜梁需要往复判断下一个字节,这样时间还真不一定比一字节一中断快
2.我觉得在单片机程序里设置一个输入缓存数组的话没问题吧,你只需要检测冲漏差到停止位之后将从+CMD到停止位中间的数据统一处理就可以了啊,或者是我没搞明白你的意思。
欢迎追问~
1.就算你用某种方式不出中断然后连续接收字散皮符串,那么在这个中断子程内你也一定搜梁需要往复判断下一个字节,这样时间还真不一定比一字节一中断快
2.我觉得在单片机程序里设置一个输入缓存数组的话没问题吧,你只需要检测冲漏差到停止位之后将从+CMD到停止位中间的数据统一处理就可以了啊,或者是我没搞明白你的意思。
欢迎追问~
追问
如果在中断里一直接数据应该怎么写?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询