当时,发送一串字符串:stu[]="vincent uart test";
原来的发送字符串的子函数为:
void UART0_Send_1Byte(INT8U Byte)
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF=Byte;
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
// while(!UCA0TXIFG); vincent uart test //等待发送完
}
void UART0_Send_NByte(INT8U *ptr)
{
INT8U i,l=0;
while(*ptr++!= '\0') {l++;} //计算发送数据的长度
for(i=0;i<l;i++)
{
UART0_Send_1Byte(ptr);
}
}
串口调试助手:接收时一串乱码
程序改进后:
void UART0_Send_1Byte(INT8U Byte)
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF=Byte;
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
// while(!UCA0TXIFG); vincent uart test //等待发送完
}
void UART0_Send_NByte(INT8U *ptr)
{
INT8U i,l=0;
while(*(ptr+l)!= '\0') {l++;} //计算发送数据的长度
for(i=0;i<l;i++)
{
UART0_Send_1Byte(ptr);
}
}
可以看到两个函数的区别就是在指针的应用上面:
1。 while(*ptr++ != '\0') {l++;} //计算发送数据的长度
2。 while(*(ptr+l)!= '\0') {l++;} //计算发送数据的长度
在第一种情况下:指针不断指向下一个字符,所以当程序执行
for(i=0;i<l;i++)
{
UART0_Send_1Byte(ptr);
}
指针的首地址已经不是原来字符串的首地址了。。。
在第二种情况下:意思只是取出指针第l个字符的数值,并没有改变指针的指向位置。
所以ptr依然正确指向我们指定的数组....
关于上述用法只限于字符串的发送,才有效,如果传递的数组,上述方式就不可以了,例如:
发送一串数据str[]={0xaa,0x00 ,0x00,0x01,0x02,0x03,0x04 ,055}
将str[]数组传递给函数:
void UART0_Send_NByte(INT8U *ptr)
{
INT8U i,l=0;
while(*(ptr+l)!= '\0') {l++;} //计算发送数据的长度
for(i=0;i<l;i++)
{
UART0_Send_1Byte(ptr);
}
}
会发现,打印的数据只有第一个数据,因为‘\0’的数据就是0x00,所以传递数组数据时,不可用上面的函数,函数可以改为
void UART0_Send_NByte(INT8U *ptr,INT8U lenth)
{
INT8U i;
for(i=0;i<lenth;i++)
{
UART0_Send_1Byte(ptr);
}
}
文章评论(0条评论)
登录后参与讨论