wangqh1983 发表于 2013-1-16 22:01:15

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);
}
//……

yklstudent 发表于 2013-1-16 23:41:24

这个软件能处理的吧

jlian168 发表于 2013-1-17 08:37:57

没错,低值放在低位;低高放在高位.

kentzhtao_top 发表于 2013-1-17 09:00:23

存储模式有大端和小端模式(big endian   little endian),大端模式是比较符合人类习惯的一种方式,高字节存放在低地址处,低字节存放在高地址处,小端模式则刚好相反,低地址存低字节,高地址存高字节。。。当然这是对于大于1Byte类型的数据才有效。。。。。。。。

wangqh1983 发表于 2013-1-17 11:26:20

理是都明白,我是想让它变为高位再前;好吧判断吧!可是我没有想到比较好的处理方法?

wmm20031015 发表于 2013-1-17 11:38:55

用指针就是这样,需要注意大小端的问题

wangqh1983 发表于 2013-1-17 20:22:34

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]
查看完整版本: PIC18字节顺序导致读出字节高低位颠倒…问题已搞定!