我目前正在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。
答案 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 有效,我无法驳斥此声明,但我建议您先尝试以下事项:
NB :这是一个不完整的答案,但我无法在评论中获得所有内容。如果你有足够的耐心,请用你的发现更新你的问题并评论这个答案通知我。我会回到这里并相应地更新我的答案。