这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 我用单片机的IO口模拟串口通信(波特率:9600)为何不稳定呢?

共2条 1/1 1 跳转至

我用单片机的IO口模拟串口通信(波特率:9600)为何不稳定呢?

工程师
2019-09-19 19:11:47     打赏

大家下午好!

后边是我的代码,由于串口不够用,并且受限于体积和成本,想使用IO口模拟一个串口。用定时器定时波特率为9600,使用PC上的串口工具测试的时候发现数据时好时坏,好的时候一串都是好的,坏的时候一串都是坏的,并且固定。举例:发送十六进制0x30,接受错误的时候接收的固定是0x98.发送一串30,就接收到一串98.我的发送总是对的,只要我接到什么,发给到PC上肯定就是什么。这就让我很疑惑,我发送总是对的,那说明我的波特率没问题,但是接收为什么是好是坏我解释不清楚。因此求教。

/*********************************************************************************/
#define UART_NC    55
#define UART_START 0
#define UART_STOP  9
#define UART_REC   0
#define UART_SEND  1


void uart_rec(uint8_t rx)//参数是IO口电平
{
        if(rec_flag == UART_NC)//空闲状态
        {
                if(rx == 0)//开始信号
                {
                        rec_flag = UART_START;//开始接收,第一位是起始位,丢弃
                }
        }
        else
        {
                rec_time = 0;
                 rec_flag++;
                if(rec_flag == UART_STOP)//最后一位停止位
                {
                        rec_flag = UART_NC;
                        rec_data[rec_count++] = recvData;        
                        return;
                }
                if(rx)
                {
                        recvData |= (1 << (rec_flag - 1));
                }
              else
               {
                        recvData &= ~(1 << (rec_flag - 1));
                }
        }
}
/*********************************************************************************/




关键词: 串口     模拟     波特率     通信     软件串口    

工程师
2019-09-20 14:10:07     打赏
2楼

回“明月风”:

大侠,您能传个示例代码学习学习吗?我更改一下频率试试。我只是奇怪,0x30识别成0x98,前边多了一位1,如果识别成0x18,就不奇怪了,窜位了,多了一个0。可是0x30从起始位到第一个高电平中间全是0啊,我这怎么多了一个1,要是说个别干扰,可是不管发多少,全是识别0x98。而且不是别的。



共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]