电信类外文翻译英文+译文串行通信.docx
《电信类外文翻译英文+译文串行通信.docx》由会员分享,可在线阅读,更多相关《电信类外文翻译英文+译文串行通信.docx(45页珍藏版)》请在冰豆网上搜索。
电信类外文翻译英文+译文串行通信
中文2850字
附件1:
外文资料翻译译文
串行通信
串行通信的设备是最古老的沟通机制之一。
从IBM个人电脑和兼容式电脑的时代开始,几乎所有的计算机都配有一个或多个串行端口和一个并行端口。
顾名思义,一个串行端口发送和接收串行数据,一次一位数据。
相反,一个并行端口一次发送和接收8位数据,使用8个单独的电线。
提示:
要使串行通信工作,你只需要一根三根线的电缆——1根发送,1根用来接收,1根接地。
对于并行通信,你需要采用8条导线。
尽管相对较慢的传输速度远低于并行端口,串行端口通信依然因为它简单的设备和高的成本效益而是一个受欢迎的连接选项。
图2-1显示了设备的使用串口连接部分到计算机。
使用串行端口,你可以连接到调制解调器,鼠标或设备等作为一个桥梁/路由器配置的目的
图1:
一些常见的串行设备,调制解调器,鼠标和路由器
虽然今天的消费产品中在串行连接的地方使用USB连接,但还有很多的设备使用串行端口作为与外部世界的唯一连接。
在这一章中,你将学习如何使用基于NETFramework2.0和NETCompactFramework2.0的串行通信方式来与其他的串行设备进行通信。
并且,你将建立3个阐述了如何使用串行通信的项目。
第一个项目是一个请求允许两台电脑(连接使用一个串行电缆或蓝牙连接)进行通信的通信申请。
在此应用程序的基础上,你可以进行扩展从而与手机等其他外部串行设备进行通信。
你将学习如何使用AT命令,以编程的方式控制你的手机通过串行蓝牙进行连接。
第二个项目是一个掌上电脑聊天应用程序,这个类似第一个项目。
第三个应用程序显示了如何接通全球定位系统接收器,然后提取对于显示你在地图上的当前位置有用的数据。
一些串行通信的基础知识
如前所述,一个串行设备一次发送和接收一个位数据。
有些设备因为在同一时间发送和接收数据,被称为全双工设备。
其他可以在任何时间发送或接收被称为单双工。
开始传输时,设备先发送一个起始位,其次是数据位。
该数据位可以是五,六,七,或8位,基于商定而定。
两个发送方和接收器必须设置为相同的数据通信比特或正确的比特率。
数据位被发送完后,就会发送一个停止位。
一个停止位可以是一位,一个半位,或两位。
波特率是数据从一个设备到另一个的传输速度。
波特率通常以每秒的位数(bps)来计量。
注意:
大多数串行设备传输七,八位数据。
为了检测数据已被正确发送,一个可选的校验位可以同数据位在一起。
一个校验位可以是以下内容:
奇数,偶数,mark,space或无(空的奇偶位标志几乎总是被使用)。
使用校验位提供了一个基本的机制,以检测已发送数据损坏,但不保证检查数据本身的错误。
然而,校验位可用于改善完整性数据传送。
大多数串行端口使用RS232C标准,它指定了一个连接器25针或9针(见图2)。
大多数系列设备使用9针连接器。
图2:
25针和9针串行接口
利用串口通信
你在这一章建立的第一个应用程序将是一个通信应用程序。
此通信应用程序将允许两个用户的连接使用串行连接进行通信的计算机。
请注意,我提到的是串行连接,而不是串行电缆。
这是因为两个连接的用户通过蓝牙也可以使用这个应用程序进行通信。
你可以在使用蓝牙配对的两台计算机之间建立串行连接。
最常见的方案是使用零调制解调器电缆连接两台计算机(见图3)。
图3:
零调制解调器电缆
图4显示了完成的项目。
要开始通讯,选择相应的COM串行端口来连接到远程计算机。
单击连接,然后就准备好通讯了。
图4:
选择一个串口开始通讯
需要的硬件
为了测试串行通信,你有以下几个选择:
计算机到计算机:
如上所述,你可以使用零调制解调器电缆连接两台计算机。
单台计算机:
你可以使用一个两个串口的调制解调器电缆连接到同一计算机上。
如果你的计算机只有一个串行端口,你可以使用USB到串口转换器转换到USB端口串行端口(详细信息见下一节关于这一点)。
蓝牙连接:
你可以在使用蓝牙配对的两台计算机之间建立串行连接。
USB到串行端口变换器
除非你有两台计算机,否则你将无法进行串行通讯的测试。
但是,你可以使用零调制解调器电缆连接到同一计算机上的两个串行端口模拟两台计算机通过串行端口进行通信。
但是今天大多数的电脑都带有最多一个串口(笔记本电脑和一些甚至没有一个)。
一个好的解决方法是使用USB到串行端口变换器将USB端口转换为串行端口。
因此,如果你的电脑没有任何串行端口,你将需要一对USB到串行端口适配器和一对空调制解调器电缆(见图2-5)。
然后,每个USB到串行端口适配器连接到USB端口。
图5:
USB到串行端口变换器
每个USB到串行端口适配器都有自己的驱动程序。
安装驱动程序后,右键单击桌面上的我的电脑,选择属性。
系统属性对话框框中,单击硬件选项卡,单击设备管理器按钮。
展开端口(COM和并口)项目,并找到两个新增加的COM端口(见图6)。
图6:
定位新创建的串行端口
在这个例子中,两个USB串行口分别是COM3和COM4
蓝牙适配器
除了使用零调制解调器电缆连接两个串行端口,还可以使用蓝牙对两台计算机进行配对。
我们可以给每台计算机都配备一个蓝牙适配器(见图7)。
然后,就可以给两台计算机配对并建立它们之间的串行连接了。
注意:
请参阅蓝牙适配器文件的附带文件,从而掌握如何为两个蓝牙电脑建立串行连接。
图7:
蓝牙适配器
构建聊天应用程序
使用VisualStudio2005,创建一个新的Windows应用程序,并将它命名为SerialCommChat。
按照图8所示填充默认的Form1。
图8:
利用各种控件构建默认的Form1
按照表1所示设置控件属性
表1:
控件
属性
值
Form1
Form1
lblMessage
txtDataReceived
txtDataReceived
txtDataToSend
Text
AcceptButto
BorderStyle
ScrollBars
MultiLine
MultiLine
"SerialChat"
btnSend
FixedSingle
Vertical
True
True
在NET2.0中,在工具箱中的Compo-nents标签的位置(见图9)有一个新的Windows窗体串口控件。
这个串口控件封装了所有必要的功能,你需要访问它来使用串行通讯进行通信。
你可以拖放一个串口控件到你的项目上或从代码建立一个(在这个项目里你将使用这个方法)。
图9:
工具箱中的串口控件
切换到Form1的代码视图来编辑代码。
实例化的串口类
首先,声明串口成员变量来代表你要使用的串口。
VisualBasic2005
PublicClassForm1
PrivateWithEventsserialPortAsNewIO.Ports.SerialPort
C#2005
publicpartialclassForm1:
Form
{
privateSystem.IO.Ports.SerialPortserialPort=
newSystem.IO.Ports.SerialPort();
注意:
你可以使用如前所述的串口控件,或者使用IO.Ports.SerialPort类;两者是相同的。
请注意,在VisualBasic2005中,你需要用WithEvents关键字来声明它。
这是因为串口类的DataReceived事件是在数据到达时触发串行端口的,因此你需要使用这个事件来接收数据。
对于C#2005,DataReceived事件处理程序将被添加在Form1_Load事件中。
列出所有可用的串行端口名称
在窗体第一次加载时,将检索你的计算机上所有可用的串行端口名称,然后将这些端口名称送到到ComboBox控件。
双击表格切换到代码编辑视图,Form1_Load事件处理程序将自动在这里显示出来。
按照如下代码编辑事件。
注意:
VisualStudio2005会为控件自动创建事件的处理程序,如窗体的Load事件或一个按钮的Click事件(),双击控件编辑事件处理程序。
VisualBasic2005
PrivateSubForm1_Load(_
ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)_
HandlesMyBase.Load
'---displayalltheserialportnamesonthelocalcomputer---
ForiAsInteger=0To_
My.Computer.Ports.SerialPortNames.Count-1
cbbCOMPorts.Items.Add(_
My.Computer.Ports.SerialPortNames(i))
Next
btnDisconnect.Enabled=False
EndSub
C#2005
privatevoidForm1_Load(objectsender,EventArgse)
{
//---settheeventhandlerfortheDataReceivedevent---
serialPort.DataReceived+=new
System.IO.Ports.SerialDataReceivedEventHandler(
DataReceived);
//---displayalltheserialportnamesonthelocal
//computer---
string[]portNames=
System.IO.Ports.SerialPort.GetPortNames();
for(inti=0;i<=portNames.Length-1;i++)
{
cbbCOMPorts.Items.Add(portNames[i]);
}
btnDisconnect.Enabled=false;
}
C#中的事件转移
在C#版本的Form1_Load事件中,我还增加了一个事件处理程序的串口类的DataReceived事件。
在串行口有数据输入时,此事件将被注销。
你不需要在VisualBasic2005中处理这个事件的程序,因为你可以使用Handles关键字来连接事件的处理程序。
//---settheeventhandlerfortheDataReceivedevent---
//serialPort.DataReceived+=new
//System.IO.Ports.SerialDataReceivedEventHandler(
//DataReceived);
图10显示了ComboBox控件在第一次加载时的外观。
图10:
ComboBox控件在第一次加载时的外观
打开一个串行口
一旦一个端口的名称被选中,用户点击连接按钮时,将会打开选择的端口。
你可以用下面的方法实现这一点。
VisualBasic2005
'---EventhandlerfortheConnectbutton---
PrivateSubbtnConnect_Click(_
ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)_
HandlesbtnConnect.Click
'---closetheserialportifitisopen---
IfserialPort.IsOpenThen
serialPort.Close()
EndIf
Try
'---configurethevariousparametersoftheserialport---
WithserialPort
.PortName=cbbCOMPorts.Text
.BaudRate=9600
.Parity=IO.Ports.Parity.None
.DataBits=8
.StopBits=IO.Ports.StopBits.One
EndWith
'---opentheserialport---
serialPort.Open()
'---updatethestatusoftheserialportand
'enable/disablethebuttons---
lblMessage.Text=cbbCOMPorts.Text&"connected."
btnConnect.Enabled=False
btnDisconnect.Enabled=True
CatchexAsException
MsgBox(ex.ToString)
EndTry
EndSub
C#2005
//---EventhandlerfortheConnectbutton---
privatevoidbtnConnect_Click(objectsender,EventArgse)
{
//---closetheserialportifitisopen---
if(serialPort.IsOpen)
{
serialPort.Close();
}
try
{
//---configurethevariousparametersoftheserial
//port---
serialPort.PortName=cbbCOMPorts.Text;
serialPort.BaudRate=9600;
serialPort.Parity=System.IO.Ports.Parity.None;
serialPort.DataBits=8;
serialPort.StopBits=System.IO.Ports.StopBits.One;
//---opentheserialport---
serialPort.Open();
//---updatethestatusoftheserialportand
//enable/disablethebuttons---
lblMessage.Text=cbbCOMPorts.Text+"connected.";
btnConnect.Enabled=false;
btnDisconnect.Enabled=true;
}
catch(Exceptionex)
{
MessageBox.Show(ex.ToString());
}
}
值得注意的是,你需要设置串口类的各种属性,如PortName,各种性能,波特率,奇偶校验等。
注意:
通信双方必须具有相同的属性设置。
也就是说,他们必须有同样的波特率,奇偶校验,数据位,停止位。
断开串口
断开按钮用来关闭当前打开的串行端口。
VisualBasic2005
'---EventhandlerfortheDisconnectbutton---
PrivateSubbtnDisconnect_Click(_
ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)_
HandlesbtnDisconnect.Click
Try
'---closetheserialport---
serialPort.Close()
'---updatethestatusoftheserialportand
'enable/disablethebuttons---
lblMessage.Text=serialPort.PortName&"disconnected."
btnConnect.Enabled=True
btnDisconnect.Enabled=False
CatchexAsException
MsgBox(ex.ToString)
EndTry
EndSub
C#2005
//---EventhandlerfortheDisconnectbutton---
privatevoidbtnDisconnect_Click(objectsender,EventArgse)
{
try
{
'---closetheserialport---
serialPort.Close();
//---updatethestatusoftheserialportand
//enable/disablethebuttons---
lblMessage.Text=serialPort.PortName+
"disconnected.";
btnConnect.Enabled=true;
btnDisconnect.Enabled=false;
}
catch(Exceptionex)
{
MessageBox.Show(ex.ToString());
}
}
使用串行端口发送数据
要通过串口发送数据,需要使用串口类的Write()方法。
VisualBasic2005
'---EventhandlerfortheSendbutton---
PrivateSubbtnSend_Click(_
ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)_
HandlesbtnSend.Click
Try
'---writethestringtotheserialport---
serialPort.Write(txtDataToSend.Text&vbCrLf)
'---appendthesentstringtotheTextBoxcontrol---
WithtxtDataReceived
.AppendText(">"&txtDataToSend.Text&vbCrLf)
.ScrollToCaret()
EndWith
'---clearstheTextBoxcontrol---
txtDataToSend.Text=String.Empty
CatchexAsException
MsgBox(ex.ToString)
EndTry
EndSub
C#2005
//---EventhandlerfortheSendbutton---
privatevoidbtnSend_Click(objectsender,EventArgse)
{
try
{
//---writethestringtotheserialport---
serialPort.Write(txtDataToSend.Text+
Environment.NewLine);
//---appendthesentstringtotheTextBoxcontrol---
txtDataReceived.AppendText(">"+txtDataToSend.Text+
Environment.NewLine);
txtDataReceived.ScrollToCaret();
//---clearstheTextBoxcontrol---
txtDataToSend.Text=string.Empty;
}
catch(Exceptionex)
{
MessageBox.Show(ex.ToString());
}
}
串口接收数据
串口类的一个优点是,你不必不间断地查询传入的数据。
相反,你只需要使用提供的DataReceived事件,它会自动检测到传入的数据并提醒你。
但是,由于此事件运行占用一个单独的线程,任何更新主窗口的企图都将导致错误。
因此,你需要在主线程(Form1中)使用委托来更新控件。
VisualBasic2005
'---EventhandlerfortheDataReceivedevent---
PrivateSubDataReceived(_
ByValsenderAsObject,_
ByValeAsSystem.IO.Ports.SerialDataReceivedEventArgs)_
HandlesserialPort.DataReceived
'---invokethedelegatetoretrievethereceiveddata---
txtDataReceived.BeginInvoke(New_
myDelegate(AddressOfupdateTextBox),_
NewObject(){})
EndSub
C#2005
//---EventhandlerfortheDataReceivedevent---
privatevoidDataReceived(objectsender,
System.IO.Ports.SerialDataReceivedEventArgse)
{
//---invokethedelegatetoretrievethereceiveddata---
txtDataReceived.BeginInvoke(new
myDelegate(updateTextBox));
}
DefinethedelegateandtheupdateTextBox()subroutineasfollows.
VisualBasic2005
'---DelegateandsubroutinetoupdatetheTextBoxcontrol---
PublicDelegateSubmyDelegate()
PublicSubupdateTextBox()
'---appendthereceiveddataintotheTextBoxcontrol---
WithtxtDataReceived
.AppendText(serialPort.ReadExisting)
.ScrollToCaret()
EndWith
EndSub
C#2005
//---DelegateandsubroutinetoupdatetheTextBoxcontrol---
publicdelegatevoidmyDelegate();
publicvoidupdateTextBox()
{
//---appendthereceiveddataintotheTextBoxcontrol---
txtDataReceived.AppendText(serialPort.ReadExisting());
txtDataReceived.Scro