打印
[程序源码]

使用IO模拟9600串口接收数据不稳定求指教

[复制链接]
2379|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
andiwxz|  楼主 | 2017-11-22 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好:      后边是我的代码,由于串口不够用,并且受限于体积和成本,想使用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));
                }
        }
}
/*********************************************************************************/

相关帖子

沙发
Ketose| | 2017-11-22 16:47 | 只看该作者
本帖最后由 Ketose 于 2017-11-22 16:49 编辑

采样频率高点.
电脑上是9600,那么你的采样频率就得是9600*4

使用特权

评论回复
板凳
ningling_21| | 2017-11-22 17:56 | 只看该作者
需要用定时器,采样率必须高

使用特权

评论回复
地板
coody| | 2017-11-22 19:34 | 只看该作者
我使用3倍采样,非常稳定可靠。上世纪90年代,多串口的MCU很少(有也很贵),我就经常用模拟串口了,工控板用的。
现在的MCU速度快,轻易就能模拟8个全双工串口(9600bps),我现在用STC 1T 51或STM32来模拟比较多,用于工控行业的数据采集。

使用特权

评论回复
5
andiwxz|  楼主 | 2017-11-23 14:48 | 只看该作者
楼上的能传个示例代码学习学习吗?我更改一下频率试试。我只是奇怪,0x30识别成0x98,前边多了一位1,如果识别成0x18,就不奇怪了,窜位了,多了一个0。可是0x30从起始位到第一个高电平中间全是0啊,我这怎么多了一个1,要是说个别干扰,可是不管发多少,全是识别0x98。而且不是别的。

使用特权

评论回复
6
wangyy608| | 2017-11-23 15:21 | 只看该作者
你的程序最后接收的是最高位,你接收慢了,最后多了个1

使用特权

评论回复
7
linqing171| | 2017-11-23 20:44 | 只看该作者
波特率慢了。远超了5%

使用特权

评论回复
8
NE5532| | 2017-11-23 23:07 | 只看该作者
有没有其他中断,干扰采样点?我原来用另一个端口在采样点翻转,然后示波器双踪来看采样点是否在位中心,每个位1个采样点也可以稳定工作,就是时间要调好。

使用特权

评论回复
9
andiwxz|  楼主 | 2017-11-24 09:39 | 只看该作者
谢谢大家,好象是被什么干扰了,我把程序其余功能全部屏蔽就好了很多。目前分析原因一个是内部优先级处理有问题,有其他中断影响,二一个中断定时可能调试的不准确,在调试。估计优化优化就可以了。再次感谢大家!

使用特权

评论回复
10
15889661439| | 2019-9-19 09:55 | 只看该作者
coody 发表于 2017-11-22 19:34
我使用3倍采样,非常稳定可靠。上世纪90年代,多串口的MCU很少(有也很贵),我就经常用模拟串口了,工控板 ...

您好,三倍采样是怎么实现?我现在是104微妙采样一次的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

166

主题

258

帖子

3

粉丝