PIC18字节顺序导致读出字节高低位颠倒…问题已搞定!
本帖最后由 wangqh1983 于 2013-1-17 20:32 编辑//在我写PIC18 MODBUS程序中遇到的问题:
//我事先定义了一个结构体
typedef struct
{
short aaa;
short bbb;
short ccc;
short ddd;
.
.
.
unsigned short eee;
unsigned short fff;
unsigned short ggg;
unsigned long xxx;
unsigned long yyy;
}sMeteringData;
sMeteringData Metering;
//在数据处理中,连续读多个保持寄存器时;例如xxx = 0x12345678,在返回报文窗口中确是0x56781234,有没有好的处理方法向大家求救!
int16_t tmp;
int16_t * pBuf;
pBuf = (uint16_t *)&Metering.aaa;
tmp = *pBuf++;
while (usNRegs-- > 0)
{
*pucRegBuffer++ = ( uint8_t ) ( tmp >> 8 );
*pucRegBuffer++ = ( uint8_t ) ( tmp & 0xFF);
}
//……
这个软件能处理的吧 没错,低值放在低位;低高放在高位. 存储模式有大端和小端模式(big endian little endian),大端模式是比较符合人类习惯的一种方式,高字节存放在低地址处,低字节存放在高地址处,小端模式则刚好相反,低地址存低字节,高地址存高字节。。。当然这是对于大于1Byte类型的数据才有效。。。。。。。。 理是都明白,我是想让它变为高位再前;好吧判断吧!可是我没有想到比较好的处理方法? 用指针就是这样,需要注意大小端的问题 01while( usNRegs-- > 0 )
02{
03 if ((pBuf == (int16_t *)&m_value.ep) || (pBuf == (int16_t *)&m_value.eq))
04 {
05 tmp = *(pBuf+1); /* Byte order adjust in get high byte */
06 }
07 else if (((pBuf-1) == (int16_t *)&m_value.ep) || ((pBuf-1) == (int16_t *)&m_value.eq))
08 {
09 tmp = *(pBuf-1); /* Byte order adjust in get low byte */
10 }
11 else
12 {
13 tmp = *pBuf;
14 }
15 pBuf++;
16 *pucRegBuffer++ = ( uint8_t ) ( tmp >> 8 );
17 *pucRegBuffer++ = ( uint8_t ) ( tmp & 0xFF );
18}
问题已解决!
页:
[1]