首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于X10的曼彻斯特码接收与解码

基于X10的曼彻斯特码接收与解码
EN

Stack Overflow用户
提问于 2015-12-16 10:55:49
回答 1查看 625关注 0票数 2

你好,我正在做一个项目,我需要通过X10将一些数据从一个微控制器(特别是一个ATmega32)发送到另一个微控制器(同样是一个ATmega32)。两者都在3.8646 MHz上运行,并在STK500上运行。

我似乎正确地发送了我的数据,但我的解码器似乎在解码数据时遇到了困难。

首先,当我通过X10接收数据(1字节)时,我会将每个曼彻斯特位保存在一个无符号字符数组中(1/0作为startbit,rest是数据)。然后,我将数据保存在另一个未签名的char数组(称为缓冲区)中。出于测试目的,我通过UART显示终端上的数据。相关代码可以在这里找到。

代码语言:javascript
复制
unsigned char buffer[9];
index = 2;

for (int i = 0; i < BYTE; i++)
{
    // If bit 1 is received save that
    if (reciever[index] != 0 && reciever[index+1] == 0)
    {
        buffer[i] = 1;
        index += 2;
    }
    // If bit 0 is received save that
    else if (reciever[index] == 0 && reciever[index+1] != 0)
    {
        buffer[i] = 0;
        index += 2;
    }
    else
    break;
}

for (int i = 0; i < BYTE; i++)
{
    SendChar(buffer[i]);
}

mode = MODE_IDLE;

这似乎是可行的,例如,如果发射机发送十进制150,终端显示1' won't save as a '1', but '0' will save as a '0,这意味着数据被正确发送。

但是,如果我随后试图将缓冲区解码为单个字符字节,我就永远不会得到预期的结果。在下面的代码中,我再次将接收到的数据保存在缓冲区中,然后尝试在终端和STK500上显示它们。

代码语言:javascript
复制
unsigned char buffer[9];
index = 2;

for (int i = 0; i < BYTE+1; i++)
{
    // If bit 1 is received save that
    if (reciever[index] != 0 && reciever[index+1] == 0)
    {
        buffer[i] = 1;
        index += 2;
    }
    // If bit 0 is received save that
    else if (reciever[index] == 0 && reciever[index+1] != 0)
    {
        buffer[i] = 0;
        index += 2;
    }
    else
    break;
}
unsigned char shifter = 0;
unsigned char byte = 0;
for (int i = 0; i < BYTE+1; i++)
{
    if (buffer[i] != 0)
    {
        shifter =  (1 << (BYTE - (i+1)));
        byte += shifter;

    }
    else if (buffer[i] = 0)
    {
        shifter = 0;
        byte += shifter;
    }
}
mode = MODE_IDLE;
SendChar(byte);
writeAllLEDs(byte);

在终端上,我得到128个和120个,而在STK500上只有led7和led1亮起,这意味着我的解码已经关闭。但是,如果尝试通过Atmel Studio进行调试,变量字节总是会得到我选择的正确值。

我真的需要一些帮助,因为我不知道发生了什么。

writeAllLEDs()

代码语言:javascript
复制
PORTC = ~pattern; 

SendChar()

代码语言:javascript
复制
 // Wait for transmitter register empty (ready for new character)
  while ( (UCSRA & (1<<5)) == 0 )
  {}
  // Then send the character
  UDR = Tegn;
EN

回答 1

Stack Overflow用户

发布于 2015-12-16 15:23:09

你试过用另一个端口来做LED吗?也许是硬件出了问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34310139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档