51单片机中的串口通信,我想设置一个偶校验,请问怎么配置选用工作方式3的话,SCON是多少

51单片机中的串口通信,我想设置一个偶校验,请问怎么配置选用工作方式3的话,SCON是多少,第1张

void UartInit(void) //19200bps@110592MHz

{

SCON = 0x50; //8位数据,可变波特率

AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T

AUXR &= 0xFE; //串口1选择定时器1为波特率发生器

TMOD &= 0x0F; //设定定时器1为16位自动重装方式

TL1 = 0xF4; //设定定时初值

TH1 = 0xFF; //设定定时初值

ET1 = 0; //禁止定时器1中断

TR1 = 1; //启动定时器1

}

校验和运算,必须用无符号整数,你的情况,我觉得应该使用unsigned short 进行运算。

另外,你确认了你的校验算法是正确的?校验算法有很多,比较常见的(但不一定是啊)是CRC校验,使用的算法是循环冗余校验码。

你这个。。。全加起来,很没道理啊,不知道是什么算法,但这样很可能溢出了,达不到校验的目的。

首先,默认的串口文件的缓存方式是无缓冲。其次,串口在发送数据的时候不是连续的。

比如,串口要给你0x62,0x77。那么他就先发0x62后发0x77。而如果你在他发完0x62的时候马上就read()那就会只得到0x62而0x77要再read一次。

如果你想一次就全读上来,那有两个方法。

1:你自己写一个读串口的函数,里面调用read;

例如:

int tipc_read_socket( int sockfd, char buf, int len )

{

int count = 0; //每次读取字节数

int pos = 0; //总共读取字节数

pos = 0;

do {

count = read(sockfd, &buf[pos], len - pos);

//printf("tipc_read_socket:count[%d]\n", count);

if( 0 > count )

{

if( EINTR == errno )

continue;

//当设置为non block的时候,第一次把所有的数据读取完以后,第二次的结果为-1

return( pos );

}

if( 0 == count ) break; / Nothing left! /

pos += count;

} while( len > pos );

return( pos );}

2:你设置一下输入输出属性。

struct termios newtio;

bzero( &newtio, sizeof( newtio ) );

newtioc_cc[VTIME] = ;

newtioc_cc[VMIN] = ;

tcsetattr(fd,TCSANOW,&newtio);

这个里面的VTIME,VMIN。就是读等待的时间。

设置了以后,比如你读0x62的时候read,那么他会等待你设置的时间,如果在这个时间里面0x77来了,那他会把0x62和0x77一起返回给你。这个时间跟波特率有关,应该是设置为在某种波特率的情况下连续两字节的最大间隔时间。

你第一个子数组长度应该是30,不是29

第一个子数组求和有16位就够了,不要转成DBL,会导致保留过多位。保留16位,其余溢出

求和后不可以数字转字符串,那样的话就是阿拉伯数字的字符串(每一位肯定在0~9之间)但是实际的校验和却可能什么字符都有。要用字节数组到字符串转换

下图供你参考

以上就是关于51单片机中的串口通信,我想设置一个偶校验,请问怎么配置选用工作方式3的话,SCON是多少全部的内容,包括:51单片机中的串口通信,我想设置一个偶校验,请问怎么配置选用工作方式3的话,SCON是多少、VC串口发送校验和不对、各位大侠,我写了一个linux下我写了个程序验证串口接收数据情况,是个死循环read,发现串口需要分多次read等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9277528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存