在微控制器

时间:2016-04-11 14:05:45

标签: c++ utf-8 uart

我目前正在ATMega1284p上编写一个uart-console。它应该回显字符,以便计算机端控制台实际上看到正在输入的内容,现在就是这样。

问题在于:使用ASCII可以很好地工作,但是如果我发送的东西超出了ASCII,例如a'§'我的minicom显示“ §”' '为无效或'§'以防一切正常。但得到两者的组合会让我失望,我现在不知道问题出在哪里!

以下是我的代码的一部分:

    char c;
    while(m_uart->recv(c) > 0) {
        m_lineBuff[m_lineIndex++] = c;
        if(c == '\r') {
            c = '\n';
            m_lineBuff[m_lineIndex++] = c;
            m_sendCount = 2;
        } else {
            m_sendCount = 1;
        }
        this->send();
        if(c == '\n') {
            m_lineBuff[m_lineIndex++] = '\0';
            // invoke some callbacks that handle the line at some point
            m_lineIndex = 0;
        }
    }

m_lineBuff是一个自编写(并经过测试)的字符向量。 m_uart是用于微内部硬件uart的自编写(也经过测试)的UART驱动程序。 this->send使用m_sendCount发送m_uart字节。

到目前为止我尝试了什么: 我验证了minicom的波特率和我的微匹配(115200)。我验证了频率在2%范围内(微运行在20MHz)。 minicom和micro都设置为8n1。 我证实了minicom可以把它连接到我躺在一个小板上。在那个板上任何utf-8数字都可以正常工作。

有没有人看到我的错误,或者是否有人对我未考虑的内容有所了解?

如果你们对它感兴趣,我会很乐意提供我的所有代码。

修改/精化:

观察1(开始此项目之前)

PC端程序(minicom)可以发送和接收字符。来自微控制器。它不会显示已发送的字符。

结论1(开始此项目之前)

微控制器方需要将字符发送回PC,以便您拥有控制台的行为。 因此,我立即发回任何我得到的角色。

观察2(实施后)

当我按'§'(或任何其他由超过1个字节组成的字符)时(使用minicom),我看到“ §”。

结论2(实施后)

我无法用我的知识解释的事情正在继续。也许构成字符的两个字节之间的一个小延迟导致minicom首先打印' ',因为它自己的第一个字节确实是一个无效字符,当第二个字符进入minicom时意识到它实际上是'§'但是minicom不会删除/覆盖' '。 如果这是问题,那我该如何解决呢?我的微控制器是否需要更快/更少的字符间延迟?

EDIT2:

我取代了'?'使用复制和粘贴的力量使用实际角色' '。

我做了更多测试

我试过这个角色''并且当我被驱逐时(它支持我的结论2)并且我得到了“ ”。顺便说一下,这是一个4字节的字符。 将micro和minicom的波特率设置为9600:完全相同的行为。 我设法将minicom设置为十六进制模式:它定期发送但输出十六进制...当我发送''我得到'f0 9f 98 b9“哪个(至少根据this site)是正确的...是吗支持我的结论2?更重要的是:我如何摆脱这种行为。它适用于我的小linux板,而不是我的micro。

1 个答案:

答案 0 :(得分:3)

  

编辑: op自己发现他发现的奇怪行为(可能)是 minicom 本身的错误。我的这个帖子显然失去了它的价值,除非社区认为它应该被删除,我会留在这里作为遇到类似问题时可能的解决方法的见证。

tl; dr:您的电脑应用可能无法正确解释 UTF-8

如果我们查看 ISO 8859-1 定义的扩展ASCII代码,

  

A7 10100111 § § =>部分标志

并根据此page,§的 UTF-8 编码

  

U+00A7 § c2 a7 =>部分标志

所以有根据的猜测是符号仍然正确打印,因为它属于具有相同值a7扩展ASCII代码

您的最终应用程序无法正确解释 UTF-8 U c2)符号,这就是您获得的原因? 打印出来,或者中间的组件无法向前传递正确的值。我倾向于相信你的输出是第一种情况的实例。

您声称 minicom 有效,我无法驳斥此声明,但我建议您先尝试以下事项:

  1. 尝试发送一个属于 UTF-8 但不符合 ISO 8859-1 标准的符号:如果它不起作用,这应该排除你的< em>结论#2 非常紧急;
  2. 尝试将速度降低到尽可能低的9600波特率
  3. 验证 minicom 是否正确配置以解释检查文档的 UTF-8 字符;
  4. 尝试使用一些其他应用程序从微控制器获取数据,看看结果是否一致;
  5. 验证您发送的unicode符号 U 是否正确
  6. NB :这是一个不完整的答案,但我无法在评论中获得所有内容。如果你有足够的耐心,请用你的发现更新你的问题并评论这个答案通知我。我会回到这里并相应地更新我的答案。