如何解决PIC18 UART 从 PC
我似乎无法从 PC 接收正确的字节到 PIC18F27J53。 PIC UART 设置为标准、异步、8 位、9600、无奇偶校验。 PC是win 10,我做了一个简单的UART程序,并发送了几个整数,全部用逗号分隔,如下所示。 "123,24,65,98,12,45,564,987,321,5.9,87,789,123,6554,213,8754\n"
我尝试了不同的方法,
- 尝试一个一个地发送每个字符,但是 PIC 似乎在传输的中途或早期卡住了,并且 RX 标志不再高。
- 我尝试发送每个 int 后跟“\n”和我的 PIC 来解析每个字符并在找到“\n”后切断读取。这似乎更好,我可以获取更多数据,但最终接收到的数据已损坏:某些整数错误等。
它清楚地表明这是一个同步问题,看起来 PC 对于 PIC 来说太快了? 如果是这样,我正在考虑使用同步 uart,但是根据网络,这似乎与选择的方法相去甚远,这使我不得不在异步模式下解决另一个问题?
我的问题是,进行 PIC 到 PC UART 全双工通信的最流行的稳健方式是什么?
这是我的 PIC 接收 API,相当标准和简单(我认为)。
void int_receive_data(void)
{
char input_element[10] = { 0 };
char full_rx[128] = { 0 };
for (int i = 0; i < 22; i++) {
p18f47j53_uart2_read_text(input_element,sizeof(input_element));
strncat(full_rx,input_element,strlen(input_element));
strncat(full_rx,",1);
}
}
void p18f47j53_uart2_read_text(char *output,uint8_t max_length)
{
uint8_t c;
char buffer[64] = { 0 };
for (uint8_t i = 0; i < max_length; i++) {
c = p18f47j53_uart2_receive_u8();
buffer[i] = c;
if ((c == 10) || (c == '\n')) {
buffer[i] = 0;
memcpy(output,buffer,i);
i = max_length;
}
}
}
uint8_t p18f47j53_uart2_receive_u8(void)
{
// wait for the flag
while (!PIR3bits.RC2IF);
// reset receiver if over run error
if (RCSTA2bits.OERR) {
RCSTA2bits.CREN = 0;
RCSTA2bits.CREN = 1;
return PIC_RC_FAIL;
}
// reset if frame error
if (RCSTA2bits.FERR) {
RCSTA2bits.SPEN = 0;
RCSTA2bits.SPEN = 1;
return PIC_RC_FAIL;
}
return RCREG2;
}
在 PC C# 端,我的发送看起来像这样
string[] full_separated = full_tx.Split(',');
foreach (string s in full_separated)
my_port.WriteLine(s);
PIC 以 8MHz 的内部时钟运行。 我从来没有尝试过同步方式,因为它看起来更复杂,而且 99% 的网页结果会显示异步方式,这让我觉得我可以更好地调试我正在做的事情。
有什么想法吗?建议?谢谢
解决方法
好吧,这不是真正的解决方案,而是替代方案。你应该把框架分成小块。如果可能的话,接收方用一个字符确认通知发送方继续处理另一个块。
我这么说的原因是,我有一个带有类似 PIC 的 mikroE 开发板,并且在运行“开箱即用”示例并发送 “111,222,333,444,555,666,777,888,999” 看起来“999”正在产生问题,字节太多,可能是缓冲区问题,可能是在几个字节后出现了不完美的波特率不匹配?
每 50 毫秒、500 毫秒或 1000 毫秒重复发送一次并不会让它变得更好。 改变波特率也不行。 只删除“,999”,它似乎工作正常。
如果没有“,999”,我猜它仍然处于“工作边缘”,所以也许只需删除“666,999”,交流应该会感觉更舒服。
更多的代码,更多的流量,但至少它有效..
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。