多机通信系统的设计要求:
1.一个主机HOST,两个从机0#和1#。利用串行口实现双向多机通信。
2.它们之间都是以TTL传输数据,主机和从机的P1口都接有按键K和发光二极管LED。
3.主机要向从机发送信息时,按下K0或K1键即可。若K0闭合,则向0#从机发送信息,0#从机的LED亮;若K1闭合,则向1#从机发送信息,1#从机的LED亮。
4.任意一个从机要向主机发送信息时,按下从机的按键即可,主机接收到从机的信息后立即由LED显示从机号。
有哪位大哥哥能教教我这个设计的编译程序该怎么写?谢谢
谢谢大哥的指导,,我希望您能给我一个设计完整的程序,,最主要的就是这个单片机的编译程序,,如何去编译一个按到要求的程序..谢谢!希望懂的朋友能教教我!
第1个回答 2006-12-02
简单说明用一个主机串口实现上述要求的思路:
从机地址分别为01和02
从机的串口相同引脚相互并联作为一个串口连接于主机串口,注意接线正确。
主机命令:地址号 + 命令字符串
从机命令:地址号 + 命令字符串
然后在各自收发代码中利用地址号来区别命令执行
其它请参阅如下网址本人的答复:
补充:
串行通讯的基本知识
每台计算机都提供了一个或多个串行端口。它们被依次命名为: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
从机地址分别为01和02
从机的串口相同引脚相互并联作为一个串口连接于主机串口,注意接线正确。
主机命令:地址号 + 命令字符串
从机命令:地址号 + 命令字符串
然后在各自收发代码中利用地址号来区别命令执行
其它请参阅如下网址本人的答复:
补充:
串行通讯的基本知识
每台计算机都提供了一个或多个串行端口。它们被依次命名为: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
第2个回答 2006-12-02
youjiangwei :你好,你提出的这个系统我这个学期亲自做过一个,也是多机串行通信,不过我的可以实现长距离通信.大概思路如下:
第一:采用总线结构,一端接主机,线上挂两个从机,编号为01和02;
第二:如果是短距离传输,可以直接用串口RXD和TXD相连即可,如果长距离,需要加上MAX485或者MAX232芯片来提高电平;
第三:主机P1.0,P1.1接按键K0,K1;P1.2,P1.3接LED0,LED1;从机P1.0接按键K;
编程(主机和从机的编程相似):
主程序: (注意串口工作方式2和3)首先对串口工作方式初始化,然后在主程序中编程对P1口扫描,看有没有按键按下,如果有则调用发送数据子程序,并使相应的LED发光,并把按下的键的值作为参数传给子程序;
发送串行数据子程序: 从机系统由从机的初始化程序将串口编程为模式2或3的接收方式,且置SM2=1,允许串口中断,每一个从机系统有一个对应的地址编码01和01,.当主机要发送一数据给某一个从机时,它先送出一个字节,称地址帧,它的第9位是"1",此时各从机的串口接收到第9位(RB8)都为"1",则置中断标志RI为"1",这样每一台从机都检查一下所接收到的地址是否与本机相符.若为本机地址,则清除SM2,而其余从机保持SM2=1状态.接下来主机可以发送数据块,称数据帧,它的第9位是"0",各从机接收到的RB8为"0".因此只有与主机联系上的从机(此时SM2=0)才会置中断标志RI="1",接收主机的数据,实现与主机的信息传递.其余从机因SM2=1,且第9位RB8=0,不满足接收数据的条件,而将所接收到的数据丢失.
第一:采用总线结构,一端接主机,线上挂两个从机,编号为01和02;
第二:如果是短距离传输,可以直接用串口RXD和TXD相连即可,如果长距离,需要加上MAX485或者MAX232芯片来提高电平;
第三:主机P1.0,P1.1接按键K0,K1;P1.2,P1.3接LED0,LED1;从机P1.0接按键K;
编程(主机和从机的编程相似):
主程序: (注意串口工作方式2和3)首先对串口工作方式初始化,然后在主程序中编程对P1口扫描,看有没有按键按下,如果有则调用发送数据子程序,并使相应的LED发光,并把按下的键的值作为参数传给子程序;
发送串行数据子程序: 从机系统由从机的初始化程序将串口编程为模式2或3的接收方式,且置SM2=1,允许串口中断,每一个从机系统有一个对应的地址编码01和01,.当主机要发送一数据给某一个从机时,它先送出一个字节,称地址帧,它的第9位是"1",此时各从机的串口接收到第9位(RB8)都为"1",则置中断标志RI为"1",这样每一台从机都检查一下所接收到的地址是否与本机相符.若为本机地址,则清除SM2,而其余从机保持SM2=1状态.接下来主机可以发送数据块,称数据帧,它的第9位是"0",各从机接收到的RB8为"0".因此只有与主机联系上的从机(此时SM2=0)才会置中断标志RI="1",接收主机的数据,实现与主机的信息传递.其余从机因SM2=1,且第9位RB8=0,不满足接收数据的条件,而将所接收到的数据丢失.
参考资料:单片机原理及接口技术(西安电子科技大学出版社)