你好我用延时法模拟ht66f70a 64lqfp串口接收sim,一直有问题,采样时较为准确了。你能给我点建议吗

51单片机串口通讯总是发送00_百度知道
51单片机串口通讯总是发送00
#include &C:\Keil\C51\INC\STC\STC12C5A60S2.H&
//串口1初始化函数
void UartInit(void)
//2400bps@11.0592MHz
PCON &= 0x7F;
//波特率不倍速
SCON = 0x50;
//8位数据,可变波特率
AUXR &= ...
我有更好的答案
#include &C:\Keil\C51\INC\STC\STC12C5A60S2.H&//串口1初始化函数void UartInit(void)
//2400bps@11.0592MHz{
PCON &= 0x7F;
//波特率不倍速
SCON = 0x50;
//8位数据,可变波特率
AUXR &= 0xFB;
//独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xF4;
//设定独立波特率发生器重装值
AUXR |= 0x01;
//串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10;
//启动独立波特率发生器}void main(){
UartInit();//初始化串?
SBUF=0x11;
while(TI==0);
for(count=0;count&1000;count++); //另外看看串口助手波特率设置是否是2400
靠谱!不过还请教两个小问题:1、程序中for(count=0;count&1000;count++); //数据间延时我测试过如果两个数据之间没有延时的话,收到的数据是不准确的,这个是51串口一定要的嘛??还是其他什么原因?2、为啥我那个中断进去就不对呢,一定要软件检测
如果没有延时,接收方有可能丢失数据,因此数据有不准确的情况。你用中断当然也是可以的,但处理方式上还有待改进。比如按如下修改一下试试:#include &C:\Keil\C51\INC\STC\STC12C5A60S2.H&bit flag=1;//串口1初始化函数void UartInit(void)
//2400bps@11.0592MHz{
PCON &= 0x7F;
//波特率不倍速
SCON = 0x50;
//8位数据,可变波特率
AUXR &= 0xFB;
//独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xF4;
//设定独立波特率发生器重装值
AUXR |= 0x01;
//串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10;
//启动独立波特率发生器}void main(){
//配置中断
UartInit();//初始化串?
if(flag)SBUF=0x11;
for(count=0;count&1000;count++);
}}void uart1() interrupt 4{
if(TI==1){
高级工程师
单片机接的晶振一定要是11.0592。根据你的程序。这个程序不要用内部RC震荡给你一个STC波特率计算器
没有用过 STC12C5A60S2 这款单片机,但是从你接收的情况看,你重点检查:& & 1、串口助手的波特率和单片机设置的是否一致?&&&&2、单片机程序串口波特率和晶振计算的是否准确?&&&&3、串口助手,是不是16进制接收的?&&&&4、给你一个串口调试软件,你用它试试看吧
为您推荐:
其他类似问题
您可能关注的内容
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。用SerialPort类做串口通信,为什么发送一次数据有时接收方要收两次?
我的图书馆
用SerialPort类做串口通信,为什么发送一次数据有时接收方要收两次?
http://www.debugease.com/csharp/1490054.html& &用SerialPort类做的一个串口通信的测试程序,添加了DataReceived事件处理方法,用两台机器串口直接对联发送数据,发送方在发送多于8个字节的数据时,接收方有时要分两次收,而且每次第一次收都是8个字节,这是为什么?接收发送时都做了数据转换,发送时将string转换为byte数据发送,接收方也以byte类型接收,再转换成string类型显示,如果不转换发送中文时出错!
解决方案 ?
检查一下Rthreshold属性和inbuffersize属性 &&
对呀,我虽然不是做的串口通信,我做的是socket通信,跟你你样的问题,不过我是这样解决的len是我接收到的(可能是第一次接受到的)packlen是我发过来的一个包的大小while&(len&&&packlen)&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&int&TcpFile&=&cs.ClientSocket.Receive(cs.buff,&0,&cs.buff.Length&-&len,&SocketFlags.None);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&len&+=&TcpF//便于while做出正确判断&&&&&&&&&&&&&&&&&&&&&&&&}如果我接受的数据小与一个包的大小,我就再去Receive一次 &&
串口通信和socket通信貌似还是有差别的 &&
myup5201314()&正解。你不能假定,一次发送,就能一次接收。电脑串口通讯,我们唯一可以确认的就是,接收不会切断字节,也就是接收只发生在字节边界处,所以,我们通常在第一个字节指示发送包的长度。实际上,早期的单片机接收缓冲区只有4个bit,接收就会发生在4个位处,现在通常缓冲区8个位。对于PC来说,这个缓冲区还可以更大。串口通讯是不可靠的,第一个字节有可能丢失,造成接收异常,有时候单片机速度慢还会不能及时响应造成缓冲区溢出,结果后面发送的会冲掉前面发送的内容。这时候我们需要使用串口的控制线来进行同步。如果使用控制线,可以不需要长度,也不需要其他额外的校验,当然也可以进行一定的校验。在发送数据的时候,你可以让某个控制线始终处于高电平,当发送结束时,控制他为低电平。此外还需要缓冲区的高低电平控制,缓冲区满时拉高某个控制线的电平。对于PC来说,这些其实可以省略,PC对PC可以保证缓冲区不溢出。还可以保证接收的数据完整。你要做的,就是使用2根空闲的控制线来同步两者间数据发送。 &&
检查一下Rthreshold属性和inbuffersize属性正解 &&
串口的通讯可靠不可靠取决于环境和协议,就想同样是双绞线,用UDP协议和TCP协议传输数据可靠性是完全不一样的,串口的电气性能是没有问题的,毕竟是很成熟的技术了,并且广泛的运用在工业控制领域,所以不能说串口通讯是不可靠的。串口参数中的停止位和校验位都可以简单的纠正通讯中的错误。但楼主的问题显然不是串口不稳定造成的,若是不稳定应该产生误码才对,而不是数据流的截断!问题的原因应该是串口配置的问题。 &&
那个Serlai类可以设置接收到几个字节后触发那个DataReceived的事件,你可以设置接收1个字节就触发,然后可以一次性把缓冲区里面的数据全部拿出来你最好设计一个好一点的协议,我曾经做的那个要有非常大的电流,有100安培还不止,搞得干扰很严重 &&
raulredondo大哥,您能不能说说怎么设置接收到几个字节后触发那个DataReceived的事件? &&
suliang1984,我没有在SerialPort类中找到Rthreshold属性呀!接收缓冲区肯定是足够大的! &&
ReceivedBytesThreshold决定接收几个字节触发DataReceived,默认为1串口编程基本都会遇到这个问题!我的办法:定义一个全局变量,DataReceived事件连接读到的字符串,满足条件处理完当前数据后,清空变量! &&
串口是慢速通讯机制,当你的串口有数据到达,响应事件的时候,其实数据还没有发送完毕,如果你非要一次就接收完毕,你要设立一个延时我建议你不要设立延时,而是在你的串口指令编码中设置好标志位,例如字节的起始标志和终止标志,以及字节长度等信息,通过判断这些信息达到完成接受的目的。我做串口是采用一个死循环,一直采集,然后分割数据,把数据成块加入到ArrayList可以看我得Bloghttp://blog.csdn.net/cnming/archive//1597930.aspx串口程序不处理好,会有数据掉包的现象 &&
串口(RS232)的通讯是不可靠的,他的电气特性不同于使用对绞线的网线。1、他使用TTL电平,电压高。2、允许的漏电流较高,容易受到干扰,也不可以长距离传送。3、使用原始的高低电平来区别1、0,延时,码率不同都会造成干扰。短距离,优良环境中才能可靠工作,如果在恶劣环境中,要么使用RS485,或者使用光电串口,并且加上软件纠错。LZ的问题并非干扰,我只是告诉他,将来要注意干扰问题,在设计通讯协议的时候要充分考虑串口的不可靠。 &&
BlueTrees(蜗牛)&正解,但只要设计合理这些问题可以避免的。cnming(cnming)&的方法也可以,曾经我用过这种发法:不适用串口类的DataReceived事件触发,而是循环判断inputbuffer中的数据长度,比如你一直要发送的数据长度是12字节,那么当判断到inputbuffer的长度大于等于12字节时读取缓冲中的数据。虽然有可能inputbuffer的数据会超出长度,将超出长度的数据截断就可以了。不过要考虑再循环中加入超时,否则有可能陷入死循环。建议自己写一个简单的传输协议,用串口做数据流的不间断传输可靠性实在不敢保证。 &&
DataReceived事件由Rthreshold属性触发,如果Rthreshold属性设为8,发送方在发送多于8个字节但是少于16个字节的数据时,接受一次,如果发送等于或多于16个字节少于24字节,就接受两次,如此类推 &&
TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢51单片机模拟串口的三种方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机模拟串口的三种方法
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩7页未读,
定制HR最喜欢的简历
你可能喜欢串口通信中接收数据时延迟处理与缓存处理的解决方案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
串口通信中接收数据时延迟处理与缓存处理的解决方案
总评分3.9|
用知识赚钱
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 usb转串口驱动 的文章

 

随机推荐