数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 14977|回复: 35

[other] STC单片机串口发送--串口助手接收数据错误的问题[解决方法在23#]

[复制链接]
发表于 2019-10-17 10:40:29 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2019-10-18 09:49 编辑

起因:最近在玩红外线遥控器接收,用到了串口助手,用到了串口程序,于是问题出现了!!!
简述:玩单片机七八年了,从开始后不久就要学习单片机与电脑间的串口通信,可以肯定的说STC51单片机的串口初始化代码真的已经用烂了,电脑中存留的各种代码中很多都有好用的串口通信代码且复制粘贴重来没出过问题的,这次尴尬了。
一、测试用单片机型号:STC12C4052AD(曾用芯片:STC12C5A32S2、STC15W408AS)
二、测试代码:
#include <STC12C2052AD.H>
//==============================================
void main()
{
SCON = 0x50; //T1工作于方式1
TMOD = 0x20;  //T1 8位自动重装
TH1 = 0xf3; //(256-12000000/12/32/2400)=243=0xf3波特率2400
TL1 = 0xf3;
TR1 = 1;
//注:因为没有用到中断,所以没有设置ES=1;EA=1
while(1)
{
SBUF = 10;
while( TI == 0 );
TI = 0;
}
}

三、测试结果:
注1:电脑串口为主板原生串口经RS232转的串口COM1
注2:错误现象:下图中电脑端接收的串口数据每次“打开串口”时都是不同的!!!!

四、测试代码源自STC单片机官网,代码如下:
STC MCU Limited
8.4 串行口的测试程序
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 1T 系列单片机串行口功能 (8-bit/9-bit) -----------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82944243 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -----------------------*/
/* 请在程序中或文章中注明使用了宏晶科技的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 18432000L //System frequency
#define BAUD 9600 //UART baudrate
/*Define UART parity mode*/
#define NONE_PARITY 0 //None parity
#define ODD_PARITY 1 //Odd parity
#define EVEN_PARITY 2 //Even parity
#define MARK_PARITY 3 //Mark parity
#define SPACE_PARITY 4 //Space parity
#define PARITYBIT EVEN_PARITY //Testing even parity
sbit bit9 = P2^2; //P2.2 show UART data bit9
bit busy;
void SendData(BYTE dat);
void SendString(char *s);
void main()
{
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9-bit variable UART, parity bit initial to 0
#endif
TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
TR1 = 1; //Timer1 start run
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
SendString("STC12C2052AD\r\nUart Test !\r\n");
while(1);
}

//********************
这个实验昨天在家了玩了一下午,百般实验无果,怀疑是STC_ISP软件的串口助手有问题(下载程序正常),换用了其他串口调试助手仍然不行,接下怀疑自制的自动断电下载线传输有问题,于是换用了USB_TTL下载线仍然是下载程序正常但串口通信不正常,接下来怀疑家里电脑的WIN7旗舰版有问题,今天用公司里的XP系统的电脑测试现象依然如故,接下来就只有怀疑人生了,各位说说问题还会出现在哪里呢,期待各位指点,先谢了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 2019-10-17 11:00:52 | 显示全部楼层
应该去网上找单片机论坛可能更好解决一些。
回复 支持 反对

使用道具 举报

发表于 2019-10-17 11:11:23 | 显示全部楼层
先单独用串口线和串口程序测试,自发自收
回复 支持 反对

使用道具 举报

发表于 2019-10-17 12:12:27 | 显示全部楼层
电脑坏了,,地线接了没:lol:
回复 支持 反对

使用道具 举报

发表于 2019-10-17 12:33:47 | 显示全部楼层
电脑  usbttl 板子全部换了试试呗 一个个排除。
回复 支持 反对

使用道具 举报

发表于 2019-10-17 13:05:53 | 显示全部楼层
根据你想要的波特率2400来看,你设置为TH1=TL1=xF3。但是使用STC的公式计算出来的波特率是2403,不是你期待的2400,所以应该在这里有问题。改一下波特率吧。
回复 支持 反对

使用道具 举报

发表于 2019-10-17 14:01:44 | 显示全部楼层
本帖最后由 bg4rff 于 2019-10-17 14:02 编辑

void UartInit(void)                //2400bps@12.000MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0x64;                //设定定时初值
        TH1 = 0x64;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}
定时值好像不一样,这个是软件提供的初始化函数,老文档对不上,仅供参考
主要是计算波特率/32这个鬼东西不知道哪里来的
回复 支持 反对

使用道具 举报

发表于 2019-10-17 14:03:11 | 显示全部楼层
换11.0592MHz的晶振试一下呢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 14:49:32 | 显示全部楼层
hgddgff 发表于 2019-10-17 11:11
先单独用串口线和串口程序测试,自发自收

我现在做的就是串口的测试,stc_isp软件本身就是串口通信的,我曾经在不连接单片机的情况下短路RXD/TXD,在串口助手里发送数据接收到的完全正确。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 14:51:24 | 显示全部楼层
szb314 发表于 2019-10-17 12:12
电脑坏了,,地线接了没

这个不懂的,电脑一直就那样的,貌似是两脚插头没有地线呀,需要单独接地线吗?请教!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 14:55:32 | 显示全部楼层
fair2017 发表于 2019-10-17 13:05
根据你想要的波特率2400来看,你设置为TH1=TL1=xF3。但是使用STC的公式计算出来的波特率是2403,不是你期待 ...

这是没办法的事情,板载的就是12MHz晶振,我将波特率从1200到115200都验算了,只有2400时数据的小数点后最小,也就是误差最小,另外这个代码已经用过无数次了真的没出现如此状况。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 15:58:22 | 显示全部楼层
bg4rff 发表于 2019-10-17 14:01
void UartInit(void)                //2400bps@12.000MHz
{
        PCON &= 0x7F;                //波特 ...

你的代码初值与我的不同是因为你的设置了AUXR的B6位的T1x12=1,也是设置为1T模式,在计算时比我的12T模式少除一次12所以各不相同了,虽然我的问题没解决,但是你说的/32的问题是老的C51单片机就有的,电源控制寄存器PCON的B7位SMOD,他是控制波特率倍速的开关,传统单片机的计算公式波特率=2的SMOD次方/32*(定时/计算器溢出速率),而因为经常不使用波特率倍速功能,所以SMOD默认为初始值0,此时2的0次方为1,也就没人关心SMOD项了,就成了只有/32了,既然STC兼容了C51就仍然要用这些的,/32就仍然需要至于为什么是32就需要高手解释了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 16:03:05 | 显示全部楼层
组合开关 发表于 2019-10-17 14:03
换11.0592MHz的晶振试一下呢。

我的板子用的是STC15W408AS,这个单片机是没有外接晶振而是使用内部RC的,一直是设置在11.1592MHz的,因为总是数据不对才找出以前用的板子用以前好用的代码来单独试验串口,而板载晶振就是12MHz的,以前没问题,现在不懂了。
回复 支持 反对

使用道具 举报

发表于 2019-10-17 16:56:53 | 显示全部楼层
注1:电脑串口为主板原生串口经RS232转的串口COM1注2:错误现象:下图中电脑端接收的串口数据每次“打开串口”时都是不同的!!!!

这肯定是中间有问题。。。。。。。。是否共地了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 21:15:07 | 显示全部楼层
devcang 发表于 2019-10-17 16:56
注1:电脑串口为主板原生串口经RS232转的串口COM1注2:错误现象:下图中电脑端接收的串口数据每次“打开串 ...

我的实验系统如下图,是否有问题:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2019-10-17 22:57:47 | 显示全部楼层
慕名而来 发表于 2019-10-17 21:15
我的实验系统如下图,是否有问题:

PC串口的第5PIN的地你没接?
回复 支持 反对

使用道具 举报

发表于 2019-10-17 23:43:19 | 显示全部楼层
慕名而来 发表于 2019-10-17 14:49
我现在做的就是串口的测试,stc_isp软件本身就是串口通信的,我曾经在不连接单片机的情况下短路RXD/TXD, ...

串口自发自收一般是没有问题,但是说明不了任何问题,你要用串模块A和串口模块B两个进行一个收一个发的测试。要不然就用示波器看波形计算实际的波特率。我以前遇到过一种USB转TTL的模块有几个波特率不准,自发自收没有问题,虽然波特率不准,但是收发都是自己,再不准也是一样的,通讯是没有问题的,但是跟别的USB转TTL通讯就有问题,波特率不一样了。
回复 支持 反对

使用道具 举报

发表于 2019-10-17 23:44:03 | 显示全部楼层
fair2017 发表于 2019-10-17 13:05
根据你想要的波特率2400来看,你设置为TH1=TL1=xF3。但是使用STC的公式计算出来的波特率是2403,不是你期待 ...

对于单片机来说2400的波特率和2403的波特率是没有区别的。
回复 支持 反对

使用道具 举报

发表于 2019-10-17 23:45:12 | 显示全部楼层
bg4rff 发表于 2019-10-17 14:01
void UartInit(void)                //2400bps@12.000MHz
{
        PCON &= 0x7F;                //波特 ...

低速串口是这样的,要分频。
回复 支持 反对

使用道具 举报

发表于 2019-10-17 23:45:37 | 显示全部楼层
组合开关 发表于 2019-10-17 14:03
换11.0592MHz的晶振试一下呢。

跟晶振无关。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-21 16:44 , Processed in 0.405601 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表