Ⅰ 怎么设计一个多机通信系统(单片机)
简单说明用一个主机串口实现上述要求的思路:
从机地址分别为01和02
从机的串口相同引脚相互并联作为一个串口连接于主机串口,注意接线正确。
主机命令:地址号 + 命令字符串
从机命令:地址号 + 命令字符串
然后在各自收发代码中利用地址号来区别命令执行
其它请参阅如下网址本人的答复:
http://..com/question/12535506.html
http://..com/question/12522809.html
http://..com/question/11725744.html
http://..com/question/11040704.html
http://..com/question/10941227.html
补充:
串行通讯的基本知识
每台计算机都提供了一个或多个串行端口。它们被依次命名为:COM1、COM2 等等。在标准的 PC 中,鼠标通常被连接到 COM1 端口。调制解调器可能连接到 COM2,扫描仪被连接到 COM3,等等。串行端口提供了计算机与这些外部串行设备之间的数据传输通道。
串行端口的本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时,字节数据被转换为串行的位。在接收数据时,串行的位将被转换为字节数据。
我的理解:串行口数据通信的实质是ASCII(美国标准信息交换码)的传输。你可理解是传输ASCII码,而实际传输的是ASCII码(其二进制形式,8位组成一字节)。它又可看成是8位二进制数,例字符A 其二进制表示为 01000001,MSCOMM发送时完全按照此二进制信号发送,由低位至高位传输。又能理解为10进制的64。在计算机内通常以16进制表示为41。由2个8位二进制数据组成16位二进制数,通常用于数据的二进制通信。你的程序代码采用以文本方式取回数据,这是在MSCOMM控件内部进行解决,而无须VB编程员来处理。
见MSCOMM控件的:
InputMode 常数
常数 值 描述
comInputModeText 0 (缺省)通过 Input 属性以文本方式取回数据。
comInputModeBinary 1 通过 Input 属性以二进制方式检取回数据。
以下是由MICROSOFT提供的关于串行通讯和MSCOMM控件的一些说明,可能对你答辩有用,供参考。
串行通讯的基本知识
每台计算机都提供了一个或多个串行端口。它们被依次命名为:COM1、COM2 等等。在标准的 PC 中,鼠标通常被连接到 COM1 端口。调制解调器可能连接到 COM2,扫描仪被连接到 COM3,等等。串行端口提供了计算机与这些外部串行设备之间的数据传输通道。
串行端口的本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时,字节数据被转换为串行的位。在接收数据时,串行的位将被转换为字节数据。
要完成数据的传输,还需要进一步一个解释层。在操作系统一边,Windows 使用了通讯驱动程序 Comm.drv,以便使用标准的 Windows API 函数发送和接收数据。驱动程序通常由串行设备制造商提供,以便将其硬件与 Windows 连接。在使用 Communications 控件时,实际上使用了 API 函数,API 函数将被 Comm.drv 解释并传输给设备驱动程序。
作为程序员,只需关心如何与 Windows 打交道。作为 Visual Basic 程序员,只需要关心 Communications 控件提供的对 Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视 Communications 控件的属性和事件。
建立串行端口连接
使用 Communications 控件的第一步是建立与串行端口的连接。下表列出了用于建立串行端口连接的属性:
属性 描述
CommPort 设置或返回通讯端口号。
Settings 以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。
PortOpen 设置或返回通讯端口的状态。以及打开和关闭端口。
打开串行端口
要打开串行端口,可以使用 CommPort、PortOpen 和 Settings 属性。例如:
'打开串行端口
MSComm1.CommPort = 2
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
CommPort 属性确定打开哪个串行端口。假如 COM2 上连接有一个调制解调器,则在上面的例子中需要将值设置为 2 (COM2) 才能连接到该调制解调器。CommPort 属性值可以设置为 1 到 16 之间的任何值(缺省值为 1),然而,如果将该值设置为系统中并不存在的 COM 端口,将会产生错误。
Settings 属性可以用来指定波特率、奇偶校验、数据位数和停止位数。按照缺省规定,波特率被设置为 9600。奇偶校验设置为了进行数据校验。这通常是不用的,并设置为"N"。数据位数指定了代表一个数据块的比特数。停止位指出了何时接收到一个完整数据块。
在指定了要打开的端口,以及如何进行数据通讯之后,就可以使用 PortOpen 属性建立连接了。它是一个布尔值,即取值范围为 True 或 False。然而,如果端口无效,或者 CommPort 属性设置有误,或者该设备不支持指定的设置,就会产生错误;即使没有产生错误,外部设备也不能正常工作。将 PortOpen 属性设置为 False 即可关闭该端口。
缓冲区内存分配
InBufferSize 和 OutBufferSize 属性指定了为接收和发送缓冲区分配的内存数量。按照缺省规定,它们被分别设置为上图所示的值。这两个值设置得越大,应用程序中可用的内存就越少。然而,如果缓冲区太小,就要冒缓冲区溢出的风险,除非采用握手信号。
注意 鉴于现在大多数微机可用的内存量,由于有更多的可用资源,缓冲区内存分配已不那么至关紧要了。换言之,可以把缓冲区的值设得高一些而不影响应用程序的性能。
RThreshold 和 SThreshold 属性
RThreshold 和 SThreshold 属性,表示在 OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。OnComm 事件被用来监视和响应通讯状态的变化。如果将每个属性的值都设置为零 (0),就可以避免发生 OnComm 事件。如果将该值设置为非零的值(比如 1),那么每当缓冲区中接收到一个字符时,就会产生 OnComm 事件。
Output 属性被用来向发送缓冲区发出命令和数据。
与 Input 属性类似,数据可以以文本或二进制格式发送。Output 属性必须用字符串变体型发送文本,用 Byte 数组变体型发送二进制数据。
可用 Output 属性发送命令、文字字符串或 Byte 数组数据。
MSComm 控件
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
语法
MSComm
说明
MSComm 控件提供下列两种处理通讯的方式:
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的"确定"响应。
每个使用的 MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。可以在 Windows"控制面板"中改变端口地址和中断地址。
尽管 MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。
属性 描述
CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
OnComm 事件
无论何时当 CommEvent 属性的值变化时,就产生 OnComm 事件,标志发生了一个通讯事件或一个错误。
语法
Private Sub object_OnComm ()
OnComm 事件语法包括下列部分:
部分 描述
object 对象表达式,其值是"应用于"列表中的对象。
说明
CommEvent 属性包含实际错误或产生 OnComm 事件的数码。注意,设置 Rthreshold 或 Sthreshold 属性为 0,分别使捕获 comEvReceive 和 comEvSend 事件无效。
MSComm 控件常数
Handshake 常数
常数 值 描述
comNone 0 无握手。
comXonXoff 1 XOn/Xoff 握手。
comRTS 2 Request-to-send/clear-to-send 握手。
comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。
OnComm 常数
常数 值 描述
comEvSend 1 发送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 线变化。
comEvDSR 4 data-set ready 线变化。
comEvCD 5 carrier detect 线变化。
comEvRing 6 振铃检测。
comEvEOF 7 文件结束。
Error 常数
常数 值 描述
comEventBreak 1001 接收到中断信号
comEventCTSTO 1002 Clear-to-send 超时
comEventDSRTO 1003 Data-set ready 超时
comEventFrame 1004 帧错误
comEventOverrun 1006 端口超速
comEventCDTO 1007 Carrier detect 超时
comEventRxOver 1008 接收缓冲区溢出
comEventRxParity 1009 Parity 错误
comEventTxFull 1010 传输缓冲区满
comEventDCB 1011 检索端口 设备控制块 (DCB) 时的意外错误
InputMode 常数
常数 值 描述
comInputModeText 0 (缺省)通过 Input 属性以文本方式取回数据。
comInputModeBinary 1 通过 Input 属性以二进制方式检取回数据。
Output 属性
往传输缓冲区写数据流。该属性在设计时无效,在运行时为只读。
语法
object.Output [ = value ]
Output 属性语法包括下列部分:
部分 描述
object 对象表达式,其值是"应用于"列表中的对象。
value 要写到传输缓冲区中的一个字符串。
说明
Output 属性可以传输文本数据或二进制数据。用 Output 属性传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的 Variant 到 Output 属性。
正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等等的数据,要以二进制形式发送。
数据类型
Variant
Ⅱ 在stm32usb转串口芯片CH340G中DTR#,RTS#该怎样理解呀,各位路过的看一下,在此拜谢啦
为了简单易理解,不再引入DCE(modem等)设备,按通常情况两个终端设备DTE2DTE之间直接通信(比如单片机之间或单片机与PC之型扒慧间)讲解,所以通信引脚采用交叉连接方式。
DTR信号是输出信号,DTR的意思是Data
Terminal
ready
,数据终端(计算机、单片机数据的原始发送者和最终接收者)准备好。对于单片机和PC机,DTR是输出引脚,表示本机已经上电可以工作。
一般接对端的输入脚--DSR,RS232低电平有效,表示本设备已经上电,处于工作状态。
DSR
的意思是Data
Set
Ready
,数据传送者(Modem等)准备好。对于单片机和PC机来讲,DSR是输入引脚,检测连接的设备是否上电。
RTS是终端机的输出引脚,CTS是终端机的输入引脚RTS与CTS是通信中为了慢终端接收数据时避免接收缓冲区溢出而采用的硬件握手信号。当RTS有效时,表示本设备有数据要发送,RTS接对端的CTS。当对端设备缓冲区数据处理完毕,会在他的RTS引脚送出有效信号发送到本机CTS,本机检测到后,开始发卜答送数据,当对端缓冲区满时,对端RTS引脚无效,本机检测到后暂停数据发送,等待对端RTS有效。
本机接收数据时,RTS与CTS信号的配合大体一样。
最后补充一点,CH340与PL2303类似,芯片输出的RSC232信号都是反相的TTL电平,就此颂是高电平有效,便于与MAX232之类电平转换电路连接。所以信号名称都加上了反相标志如:~、#、^、_N
等。
Ⅲ 单片机汇编语言8只数码管显示1-8
1、数码管显示演示程序:在8个LED数码管上依次显示1,2,3,4,5,6,7,8。引用端口:数码管数据p0,数码管控制p2;
DIS_DIGITEQU40H
;位选通值,传送到P2口用于选通当前数码管的数值,
;如等于0xfe时,选通P2.0口数码管
DIS_INDEXDATA41H
;显示索引,用于标识当前显示的数码管和缓冲区的偏移量
DIS_BUFDATA50H
;显于缓冲区起始地址
ORG0000H
AJMPMAIN
ORG000BH
AJMPINTT0
ORG0100H
MAIN:MOVP0,#0FFH;初始化I/O口
MOVP2,#0FFH
MOVTMOD,#02H;定时器0在模式2下工作
MOVTL0,#38H;每200μs产生一次溢出
MOVTH0,#38H;自动重装初值
SETBET0;使能定时器0中断
SETBTR0;启动定时
SETBEA;使能总中断
MOVDPTR,#DIS_CODE;设定显示初值为1-8
MOVA,#1;初值为1,以后顺序加1
MOVCA,@A+DPTR
MOVDIS_BUF,A
MOVA,#2
MOVCA,@A+DPTR
MOVDIS_BUF+01H,A
MOVA,#3
MOVCA,@A+DPTR
MOVDIS_BUF+02H,A
MOVA,#4
MOVCA,@A+DPTR
MOVDIS_BUF+03H,A
MOVA,#5
MOVCA,@A+DPTR
MOVDIS_BUF+04H,A
MOVA,#6
MOVCA,@A+DPTR
MOVDIS_BUF+05H,A
MOVA,#7
MOVCA,@A+DPTR
MOVDIS_BUF+06H,A
MOVA,#8
MOVCA,@A+DPTR
MOVDIS_BUF+07H,A
DISPLAY:MOVDIS_DIGIT,#0FEH;初始从第一个数码管开始扫描
MOVDIS_INDEX,#0
SETBTR0;启动定时器0,开始动态扫描显示
MAIN_LP:NOP
;主程序循环,可增加其它代码以改变50H-57H中的值以改变显示内容
SJMPMAIN_LP
;=====================================================
INTT0:
;定时器0中断服程序,用于数码管的动态扫描
PUSHACC
PUSHPSW
MOVP2,#0FFH;先关闭所有数码管
MOVA,#DIS_BUF;获得显示缓冲区基地址
ADDA,DIS_INDEX;获得偏移量
MOVR0,A;R0=基地址+偏移量
MOVA,@R0;获得显示代码
MOVP0,A;显示代码传送到P0口
MOVP2,DIS_DIGIT;
MOVA,DIS_DIGIT
;位选通值左移,下次中断时选通下一位数码管
RLA
MOVDIS_DIGIT,A
INCDIS_INDEX
;DIS_INDEX加1,下次中断时显示下一位
ANLDIS_INDEX,#0x07
;当DIS_INDEX等于8(00001000B)时,清0
POPPSW
POPACC
RETI
DIS_CODE:DB28h,7eh,0a2h,62h,74h,61h,21h,7ah
DB20h,60h,30h,25h,0a9h,26h,0a1h,0b1h
;0-9和ABCDEF的数码管显示代码
END
Ⅳ 关于单片机的缓冲区/缓冲寄存器
这个怎么跟你解释呢?用火车站人流举个例子吧:SBUF相当于站台,缓冲区相当于候车室。MCS—51的SBUF就一个字节,写入同时启动发送。
Ⅳ 51单片机用433模块通信时在接收到指令在很多的情况下偶尔会死机,是不是接收中断处理程序有问题啊
re_num++;没有上限限制,你看看你的缓冲区是不是会溢出,会不会和SP发生冲突等等,特别是SP冲突的话不死机都不可能。