导航:首页 > 操作系统 > 51单片机通讯错误

51单片机通讯错误

发布时间:2025-03-11 11:08:41

1. 51单片机串口连接到电脑上计算机无法显示com端口如何解决(51单片机接收不到串口数据)

1. 51单片机接收不到串口数据
灯亮,证明你的线可以供电, usb有四根线。 usb转串口线不能保证不坏, 驱动不知道能不能再win8用, 目前两种可能,驱动问题,还有就是线坏了。没有了
2. 串口检测不到51单片机
电脑板载的串口不用装驱动,打开设备管理器看看里面有没有串口,有的话看看串口号是多少,用对应的串口号进行下载就可以了,如果设备管理器中没有串口,进入BIOS设置里面,把串口使能就可以了。
3. 51单片机串口不识别
你有没有使用usb转串口工具??有的话应该不会有乱码。
4. 单片机串口无法发送数据
1:先去下一个通用的串口调试软件代替你的vb程序,用你原来单片机的程序给计算机发数据,这样如果串口调试软件接收到的数据是正确,说明你的vb程序问题。
2:如果上述方法接收的还是错误数据,则建议把单片机串口工作方式改成方式三,波特率和其他的不用变。再然串口调试软件接收数据看看。另外:“PCON=0x00;//开总中断,开串口中断”PCON不是中断控制器,下面那句才是。开中断。
5. 51单片机串口打开失败
IE = 0x90;把里面的上面那句去掉,就行了。把ES=1,再来一个IE = 0x90;实际上ES=0了
6. 51单片机串口接收数据的处理程序
3.比如读取内存地址0x22中的数据 C语言中对于内存的访问是基于指针的,这个毋庸置疑,具体操如下 unsigned int *p= (unsigned int*)0x22 ;//定义指针,并且使指针指向了0x22这个 内存地址; 那么*p就是最终你要读取的数据了。4.至于如何通过串口显示到电脑我就不多说了(这不是难点),数据你都知道了,写到串口 缓冲区,在串口调试助手下就可以看到。5.虽然没有贴出具体代码,但这里面的思想可以让你解决更多问题。
7. 51单片机串口不够
串口通讯理想距离在两米以内,太长的话就容易出现误码,延长串口通讯的措施就是采用RS485规范了。
可以达到1公里以上。
8. 51单片机串口中断接收字符串
使用超时中断,字符串按一个个字节发送下去,每个字节发送间隙比较短。如果这个间隙超过一定得时间就认为这一串字符串发送完了。用这个方法可以接受不同长度的字符串
9. 51单片机串口发不出去
51单片机一次只能接收1个字节数据(8位),若要接收两个字节,串口工具应该分成两字节发送。比如先发送高字节,再发送低字节。对于 100H,按十六进制发送 01 00,单片机收到第一字节数据保存起来,收到第二字节后将两个8位数合并成16位数。
10. 51单片机串口usb电脑不显示
单片机接入后看设备管理器中的端口,里面有说的com几。

2. 51单片机串口无法连续发送

串口中断服务interrupt函数错了, else TI = 0;这两句删掉就对了。 当SBUF一旦发送数据完毕,就会TI=1,产生一次串口中断,这个时候中断发生优先级比进入你while(!TI);这句要高(快),即进入串口中断函数,走else这里直接把TI=0了,然后回到主函数永远卡在while(!TI);了,所以你就只能发送一个字节(一帧)成功,后面全部卡在while这句里死循环了。
这个类似“模板”的串口中断服务函数不知道谁先传开的,是错的,希望以后别用了,我指else TI = 0;这里。 串口中断只考虑IF(RI==1)这里的接收判断就行了,因为你发送TI这里的处理是用的查询while的方式,不是中断。

3. 串口通讯,上位机每正常发送10次,单片机正常接收一次

不是你错了,而是串口通行本来就不稳定,要稳定就必须校验和判断是始末位,这样才能保证通信的可靠。这种情况很正常,你接收的越多错误率越高,高到你无法使用,这是我试验过的。

4. 51单片机MODBUS通讯,RTU中的CRC校验

你找一个MODBUS的协议详细资料好好看看,就是一种通讯约定,你按照它规定的格式通讯就可以了
协议发送给询问方。 Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。 Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。 下面我来简单的给大家介绍一下,对于Modbus的ASCII、RTU和TCP协议来说,其中TCP和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。所以在这里我仅介绍一下Modbus的ASCII和RTU协议。 下表是ASCII协议和RTU协议进行的比较: 协议 开始标记 结束标记 校验 传输效率 程序处理
ASCII :(冒号) CR,LF LRC 低 直观,简单,易调试
RTU 无 无 CRC 高 不直观,稍复杂

通过比较可以看到,ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验也比较容易。但是因为它传输的都是可见的ASCII字符,RTU传输的数据每一个字节ASCII都要用两个字节来传输,比如RTU传输一个十六进制数0xF9,ASCII就需要传输’F’’9’的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以一般来说,如果所需要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最好能使用RTU协议。

下面对两种协议的校验进行一下介绍。

1、LRC校验

LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。

LRC校验比较简单,它在ASCII协议中使用,检测了消息域中除开始的冒号及结束的回车换行号外的内容。它仅仅是把每一个需要传输的数据按字节叠加后取反加1即可。下面是它的VC代码:

BYTE GetCheckCode(const char * pSendBuf, int nEnd)//获得校验码

{

BYTE byLrc = 0;

char pBuf[4];

int nData = 0;

for(i=1; i<end; i+=2) //i初始为1,避开“开始标记”冒号

{

//每两个需要发送的ASCII码转化为一个十六进制数

pBuf [0] = pSendBuf [i];

pBuf [1] = pSendBuf [i+1];

pBuf [2] = '\0';

sscanf(pBuf,"%x",& nData);

byLrc += nData;

}

byLrc = ~ byLrc;

byLrc ++;

return byLrc;

}

2、CRC校验

CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。

CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。

CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。

CRC添加到消息中时,低字节先加入,然后高字节。下面是它的VC代码:

WORD GetCheckCode(const char * pSendBuf, int nEnd)//获得校验码

{

WORD wCrc = WORD(0xFFFF);

for(int i=0; i<nEnd; i++)

{

wCrc ^= WORD(BYTE(pSendBuf[i]));

for(int j=0; j<8; j++)

{

if(wCrc & 1)

{

wCrc >>= 1;

wCrc ^= 0xA001;

}

else

{

wCrc >>= 1;

}

}

}

return wCrc;

}

对于一条RTU协议的命令可以简单的通过以下的步骤转化为ASCII协议的命令:

1、 把命令的CRC校验去掉,并且计算出LRC校验取代。

2、 把生成的命令串的每一个字节转化成对应的两个字节的ASCII码,比如0x03转化成0x30,0x33(0的ASCII码和3的ASCII码)。

3、 在命令的开头加上起始标记“:”,它的ASCII码为0x3A。

4、 在命令的尾部加上结束标记CR,LF(0xD,0xA),此处的CR,LF表示回车和换行的ASCII码。

所以以下我们仅介绍RTU协议即可,对应的ASCII协议可以使用以上的步骤来生成。

下表是Modbus支持的功能码:

功能码 名称 作用
01 读取线圈状态 取得一组逻辑线圈的当前状态(ON/OFF)
02 读取输入状态 取得一组开关输入的当前状态(ON/OFF)
03 读取保持寄存器 在一个或多个保持寄存器中取得当前的二进制值
04 读取输入寄存器 在一个或多个输入寄存器中取得当前的二进制值
05 强置单线圈 强置一个逻辑线圈的通断状态
06 预置单寄存器 把具体二进值装入一个保持寄存器
07 读取异常状态 取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定
08 回送诊断校验 把诊断校验报文送从机,以对通信处理进行评鉴
09 编程(只用于484) 使主机模拟编程器作用,修改PC从机逻辑
10 控询(只用于484) 可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
11 读取事件计数 可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时
12 读取通信事件记录 可是主机检索每台从机的Modbus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误
13 编程(184/384 484 584) 可使主机模拟编程器功能修改PC从机逻辑
14 探询(184/384 484 584) 可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送
15 强置多线圈 强置一串连续逻辑线圈的通断
16 预置多寄存器 把具体的二进制值装入一串连续的保持寄存器
17 报告从机标识 可使主机判断编址从机的类型及该从机运行指示灯的状态
18 (884和MICRO 84) 可使主机模拟编程功能,修改PC状态逻辑
19 重置通信链路 发生非可修改错误后,是从机复位于已知状态,可重置顺序字节
20 读取通用参数(584L) 显示扩展存储器文件中的数据信息
21 写入通用参数(584L) 把通用参数写入扩展存储文件,或修改之
22~64 保留作扩展功能备用
65~72 保留以备用户功能所用 留作用户功能的扩展编码
73~119 非法功能
120~127 保留 留作内部作用
128~255 保留 用于异常应答

在这些功能码中较长使用的是1、2、3、4、5、6号功能码,使用它们即可实现对下位机的数字量和模拟量的读写操作。

1、读可读写数字量寄存器(线圈状态):

计算机发送命令:[设备地址] [命令号01] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

例:[11][01][00][13][00][25][CRC低][CRC高]

意义如下:

<1>设备地址:在一个485总线上可以挂接多个设备,此处的设备地址表示想和哪一个设备通讯。例子中为想和17号(十进制的17是十六进制的11)通讯。

<2>命令号01:读取数字量的命令号固定为01。

<3>起始地址高8位、低8位:表示想读取的开关量的起始地址(起始地址为0)。比如例子中的起始地址为19。

<4>寄存器数高8位、低8位:表示从起始地址开始读多少个开关量。例子中为37个开关量。

<5>CRC校验:是从开头一直校验到此之前。在此协议的最后再作介绍。此处需要注意,CRC校验在命令中的高低字节的顺序和其他的相反。

设备响应:[设备地址] [命令号01] [返回的字节个数][数据1][数据2]...[数据n][CRC校验的低8位] [CRC校验的高8位]

例:[11][01][05][CD][6B][B2][0E][1B][CRC低][CRC高]

意义如下:

<1>设备地址和命令号和上面的相同。

<2>返回的字节个数:表示数据的字节个数,也就是数据1,2...n中的n的值。

<3>数据1...n:由于每一个数据是一个8位的数,所以每一个数据表示8个开关量的值,每一位为0表示对应的开关断开,为1表示闭合。比如例子中,表示20号(索引号为19)开关闭合,21号断开,22闭合,23闭合,24断开,25断开,26闭合,27闭合...如果询问的开关量不是8的整倍数,那么最后一个字节的高位部分无意义,置为0。

<4>CRC校验同上。

2、读只可读数字量寄存器(输入状态):

和读取线圈状态类似,只是第二个字节的命令号不再是1而是2。

3、写数字量(线圈状态):

计算机发送命令:[设备地址] [命令号05] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

例:[11][05][00][AC][FF][00][CRC低][CRC高]

意义如下:

<1>设备地址和上面的相同。

<2>命令号:写数字量的命令号固定为05。

<3>需下置的寄存器地址高8位,低8位:表明了需要下置的开关的地址。

<4>下置的数据高8位,低8位:表明需要下置的开关量的状态。例子中为把该开关闭合。注意,此处只可以是[FF][00]表示闭合[00][00]表示断开,其他数值非法。

<5>注意此命令一条只能下置一个开关量的状态。

设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

4、读可读写模拟量寄存器(保持寄存器):

计算机发送命令:[设备地址] [命令号03] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

例:[11][03][00][6B][00][03][CRC低][CRC高]

意义如下:

<1>设备地址和上面的相同。

<2>命令号:读模拟量的命令号固定为03。

<3>起始地址高8位、低8位:表示想读取的模拟量的起始地址(起始地址为0)。比如例子中的起始地址为107。

<4>寄存器数高8位、低8位:表示从起始地址开始读多少个模拟量。例子中为3个模拟量。注意,在返回的信息中一个模拟量需要返回两个字节。

设备响应:[设备地址] [命令号03] [返回的字节个数][数据1][数据2]...[数据n][CRC校验的低8位] [CRC校验的高8位]

例:[11][03][06][02][2B][00][00][00][64][CRC低][CRC高]

意义如下:

<1>设备地址和命令号和上面的相同。

<2>返回的字节个数:表示数据的字节个数,也就是数据1,2...n中的n的值。例子中返回了3个模拟量的数据,因为一个模拟量需要2个字节所以共6个字节。

<3>数据1...n:其中[数据1][数据2]分别是第1个模拟量的高8位和低8位,[数据3][数据4]是第2个模拟量的高8位和低8位,以此类推。例子中返回的值分别是555,0,100。

<4>CRC校验同上。

5、读只可读模拟量寄存器(输入寄存器):

和读取保存寄存器类似,只是第二个字节的命令号不再是2而是4。

6、写单个模拟量寄存器(保持寄存器):

计算机发送命令:[设备地址] [命令号06] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

例:[11][06][00][01][00][03][CRC低][CRC高]

意义如下:

<1>设备地址和上面的相同。

<2>命令号:写模拟量的命令号固定为06。

<3>需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。

<4>下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为3。

<5>注意此命令一条只能下置一个模拟量的状态。

设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

5. 51单片机串口通讯代码和校验怎么弄,最好有现成的程序我参考一下!

串口通讯模式3用于数据收发,支持9位数据传输,其中第九位可以作为奇偶校验位。发送代码如下:

发送代码:
SPOUT: MOV C,P ;奇偶位送C
MOV TB8,C ;送发送位
MOV SBUF,A ;发送数据
JNB TI,$
CLR TI
RET

接收代码如下:

接收代码:
SPIN: JNB RI,$ ;等待接收数据
MOV A,SBUF;接收数据
MOV C,RB8 ;第九位送C
JC SPIN1 ;为1转
ORL C,P ;与奇偶位或运算
JC ERR ;为1(也就是不相等转错误)
SJMP SPOK
SPIN1: ANL C,P ;与奇偶位与运算
JNC ERR ;为0则错误
SPOK: RET
ERR: MOV A,#0FFH

以上代码详细展示了如何使用模式3进行串口通信,并对奇偶校验位进行了处理。通过这种方式,可以有效检测数据传输中的错误。

阅读全文

与51单片机通讯错误相关的资料

热点内容
androidcheckbox默认选中 浏览:587
安卓上怎么玩地平线 浏览:404
python自制录屏软件 浏览:571
热电偶与单片机 浏览:307
叶子java版命令方块 浏览:837
阿里服务器有什么作用 浏览:749
java程序开发范例 浏览:888
java17formac下载 浏览:614
rrc是什么单片机 浏览:530
linux默认网关设置 浏览:679
java函数return 浏览:25
郑州app积分商城哪里好 浏览:610
7za命令解压zip 浏览:906
硬盘加密无法进入系统 浏览:560
四叶花算法 浏览:741
宝宝滤镜app哪里下载 浏览:1002
java保护代码 浏览:806
游戏海外服务器什么意思 浏览:568
快手网红程序员排名 浏览:99
首先会通过什么寻找服务器的ip地址 浏览:199