消息关闭
    暂无新消息!

void USART_Send_IRdata2(void)
{
u16 i,j; 
u8 tmpL,tmpH,sum=0;

USART1_Send_Byte(0xAA);  //start byte
USART1_Send_Byte(0xAA);  //start byte
USART1_Send_Byte(129); //data length

for(i=0;i<4;i++) //row
{
for(j=0;j<16;j++) // column
{
tmpL=IMAGE[i][j];
tmpH=IMAGE[i][j] >> 8;
USART1_Send_Byte(tmpL);
USART1_Send_Byte(tmpH);
sum = tmpL + tmpH + sum;
}
}

USART1_Send_Byte(sum+0xAA+0xAA+129);
}

按我的理解这段程序中每出现USART1_Send_Byte一次就已经发出了一次数据,包括for内的也一样。但是到最后又整合到一起发送了一次USART1_Send_Byte(sum+0xAA+0xAA+129);
1、为啥不把它之前的全部去掉,最后就发这一次,不更省事清晰一些吗?
2、tmpL里面已经有所需发的值了,为啥还弄个tmpH出来,还右移8位?
3、用串口监听了一下收到的数据都是02d502c7 02df02d8 02df02f2 02dc02d9 02da02db这样的这字串中间的空格是啥时候加进去的?
4、02d502c7这个算一个值得话要怎么分解出来tmpL 、tmpH?

4个回答

︿ 3
1、这是厂家对报文格式的规定;就是先发0xaa,再发长度,再发数据,再发校验;最后一个发送是校验和;
2、你所发的Image是16位的,单片机串口发数据,只能一个字节一个字节,所以要移位,先发低字节,再发高字节;
3、空格是你的串口软件产生的;
4、02d502c7,应该是0x02d5和0x02c7是2个数据;其中高字节在前,低字节在后;以0x02d5说,tmpH=0x02,tmpL=0xd5。
︿ 1

AA AA 81 B6 02 B4 02 BD 02 B7 02 AD 02 B7 02 B7 02 B4 02 B4 02 B8 02 BA 02 B2 02 B6 02 B0 02 AC 02 A1 02 BE 02 B8 02 B4 02 B4 02 B2 02 BB 02 BA 02 BB 02 B8 02 B9 02 BD 02 B8 02 B5 02 B6 02 B2 02 B4 02 C5 02 BD 02 B1 02 B9 02 B7 02 B7 02 BC 02 B9 02 B4 02 BD 02 B9 02 B6 02 BB 02 B8 02 BB 02 B3 02 B6 02 BA 02 BF 02 B6 02 B8 02 BD 02 BB 02 BD 02 B8 02 BA 02 B7 02 BD 02 B4 02 B9 02 B5 02 BC 02 2A 

完整的一段串口数据
︿ 0
AA AA 81 B6 02 B4 02 BD 02 B7 02 AD 02 B7 02 B7 02 B4 02 B4 02 B8 02 BA 02 B2 02 B6 02 B0 02 AC 02 A1 02 BE 02 B8 02 B4 02 B4 02 B2 02 BB 02 BA 02 BB 02 B8 02 B9 02 BD 02 B8 02 B5 02 B6 02 B2 02 B4 02 C5 02 BD 02 B1 02 B9 02 B7 02 B7 02 BC 02 B9 02 B4 02 BD 02 B9 02 B6 02 BB 02 B8 02 BB 02 B3 02 B6 02 BA 02 BF 02 B6 02 B8 02 BD 02 BB 02 BD 02 B8 02 BA 02 B7 02 BD 02 B4 02 B9 02 B5 02 BC 02 2A 
︿ 0
最后发送USART1_Send_Byte(sum+0xAA+0xAA+129); 是校验码,就是前面所有已发数据的和(忽略溢出)
IMAGE[i][j]里面存的数据应该是16位的。但是串口一次只能发1个字节,所以需要分开来发送