串口基本概念与串口调试1. 串口的定义:串口即串行接口的简称。
CPU 与外设连接的接口电路称为I/O 口,串口是I/O 口的一种,采用串行通信协议在一条信号线上将数据逐位传输的通信模式,所以又称“串行通信接口。
2. 数据传输方式:串行通信(同步&异步)、并行通信。
3. 同步通信:指在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致,这就保证了通信双方在发送和接收数据时具有完全一致的定时关系。
4. 异步通信:5. 异步通信特点: a) 时钟要求不高,硬件成本低; b) 在不同传输系统中,通信格式设定可完全不同; c) 通信速率较慢; d) 依靠起始位和停止位可以到达同步;6. 数据编码的方式:不归零编码(NRZ )、曼彻斯特编码、差分曼彻斯特编码。
7. 数据调制方式:幅移键控(ASK )、频移键控(FSK )、相移键控(PSK )。
8. 调幅方式:a) TTL 标准:+5v ——“1”,0v ——“0”(正逻辑); b) RS-232标准:-3V~-15V ——“1”,+3V~+15V ——“0”;(负逻辑); c) 20mA 电流环:存在20mA 电流为“1”,不存在为“0”; d) 60mA 电流环:存在60mA 电流为“1”,不存在为“0”; 9. 数据传送方式:单工、半双工、全双工。
10. 数据传送速率:a) 码元速率(R B )单位:波特/秒(baud/S )波特率;R B =log 2N (N 为编码级数); b) 信息速率(R b )单位:比特/秒(Bit/S )比特率;R b =log 22;R B /R b =log 2N /log 22=log 2N (计算机中编码级数为2,比特率等于波特率)c) 位时间(位周期):传送一个二进制位所需时间;T d =1波特/波特率11. 发送时钟与接收时钟: a) 公式:F =n ×Bb) F —发送时钟频率(Hz );B —数据传输的波特率(Baud/s );n —波特率因子(Baud -1); c) 发送/接收时钟周期:T c =1/F =T d /n ;12. 串口接头类型:9针串口(DB-9)、25针串口(DB-25)13. 串口接线:接收接发送、发送接接收、信号地相连(25为7脚,9为5脚。
) 14. 串行通信特点:接线少、成本低。
15.串口连接线种类: a) 串口直连线;一公一母;发发/收收(延长) b) 串口交叉线;双公/双母;收发/发收(双机通信) 16. RS-232C : a) 全称:EIA-RS-232C (EIA :美国电子工业协会;RS :推荐标准)b) 全名:数据终端设备和数据通信设备之间串行二进制数据交换接口标准 c) 电气特性:i. RxD/TxD 上为1负0正; ii. RTS 、CTS 、DSR 、DTR 、DCD 上有效为正,无效为负17. 串口调试的内容:a) 认识串口连接线和制作串口连接线;b) 采用相应串口调试工具软件对所使用的串口进行诊断。
18. 串口参数的设置:波特率、数据位、停止位和校验位。
MSComm 控件1. MSComm 控件处理通信问题的方式2. 握手协议(Handshaking 属性):指从硬件端口向接收缓冲区发送数据时所用的内部通信协议。
3. MSComm 常用属性: a) CDHdcding :查询CD 线是否有传输(布尔型); b) CommPORT :返回端口号(整型1~16); c) CTSHoding :查询CTS 线的状态发送数据,指示传输可进行; d) DSRRcoding :查询DSR 线状态,指示做好操作准备;e) InputBufferSize :设置/返回接收缓冲区大小,以字节数为单位(默认1024) f) Input :返回并删除接收缓冲区中的数据流i. InputLen (读取字符数)=0 读取缓冲区的全部内容 ii. InputMode (检索数据类型)=commInputModeText 返回校本文本数据 iii. InputMode (检索数据类型)=commInputModeBinary 返回二进制数据 g) OutputBufferSize :设置/返回发送缓冲区大小,以字节数为单位(默认512) h)Output :往输出缓冲区写数据流 4. 产生OnComm 事件:a) CD 线为高(CDHolding=Ture )且超时,MSComm 控件中commEvent 属性设为commEventCDTO; b) CTS 线为低(CTSHolding=False )且超时,MSComm 控件中commEvent 属性设为commEventCTSTO; c) DSR 线为高(DSRHolding=Ture )且超时,MSComm 控件中commEvent 属性设为commEventDSRTO; d) 找到EOF 字符,MSComm 控件中commEvent 属性设为commEvEOF;e) RThreshold 属性设置为1,接收缓冲区每收到一个字符产生一次OnComm 事件;f) SThreshold 属性设置为1,发送缓冲区清空产生OnComm 事件,设为其它值,字符数交叉时激活一次; 5. CommEvent 属性:一旦发生通信事件或产生通信错误,依据产生的错误和事件MSComm 控件为CommEvent属性赋予不同的代码,并产生OnComm 事件。
串口调试软件开发1. 程序错误分为两类:编译错误、运行期间错误。
2. 两个编译选项:请求编译、后台编译。
3. Err 对象:属于运行期对象,包含最新关于错误的信息。
4. 捕获错误语句(on Error ):a) On Error GoTo line :转到line 执行错误处理语句。
b) On ErrorResume Next :忽略所有错误,从发生错误语句下一语句执行。
c) On Error GoTo 0:禁止当前过程中任何已启动的错误处理程序。
5. 退出错误处理语句(Resume ):a) Resume[0]:如果产生错误和处理错误程序出现在同一程序中,则从产生错误的语句恢复运行;如果错误出现在被调用过程中,则从最近一次调用包含错误处理程序的过程中的语句处恢复运行b) Resume Next :如果产生错误和处理错误程序出现在同一程序中,则从紧随产生错误的语句的下个语句恢复运行;如果错误出现在被调用过程中,则返回最后一次调用包含错误处理程序的过程,从紧随该句之后的语句处恢复运行c) Resume 标号:程序返回到标号处继续执行发送接收字符型数据程序:Private Sub CmdOpenPort_Click()mPort=1(设置串口号为1)MSComm1.PortOpen=TURE(打开串口)MSComm1.InputMode=comInputModeT ext(以字符输入)MSComm1.InputLen=0(从缓冲区输入所有字符)End SubPrivate Sub CmdSend_Click()MSComm1.Output=TxtSend.Text(将发送框的数据送入输入缓冲区) End SubPrivate Sub CmdReceive_Click()TxtReceive.Text=MSComm1.Input(将输入缓冲区字符读入接收框中) End Sub将用户键入的每个字符送到串行端口: Option ExplicitDim Buffer As VariantDim InString As StringPrivate Sub Form_Load()Form1.AutoReadraw=TruemPort=1(设置串口号为1)MSComm1.Setting="9600,N,8,1"(设置波特率)MSComm1.PortOpen=TURE(打开串口)Timer1.Interval=10(设置定时器为10ms)End SubPrivate Sub Form_KeyPress(KeyAscii As Interger)Buffer=Chr$(KeyAscii)(将输入的字符转化为字符型)MSComm1.Output=Buffer(将Buffer内的内容放入输出缓冲区) End SubPrivate Sub Timer1_Timer() If MSComm1.InBufferCount Then(如果检测到输入缓冲区有字符输入)InString=MSComm1.InputPrint InStringEnd IfEnd Sub保存数据文件:Private Sub CmdSaveData_Click()On Error GoTo ErrLineDim SaveFileId As IntegerDim I As IntegerDim FileCount As Integer(定义相同文件名称的统计)Dim StrFileName As String(定义存储文件名)FileCount = 0SaveFileId = FreeFile()(取得可以打开的文件编号)(以指定名字为文件名建立存储数据文件)StrFileName = App.Path + "\" + "数据文件_" + CStr(Year(Date)) + "年" + CStr(Month(Date)) + "月" + CStr(Day(Date)) + "日_" + CStr(FileCount) + ".txt"Do While Dir(StrFileName) <> ""(指定文件名存在)FileCount = FileCount + 1(文件记数器加1)StrFileName = App.Path + "\" + "数据文件_" + CStr(Year(Date)) + "年" + CStr(Month(Date)) + "月" + CStr(Day(Date)) + "日_" + CStr(FileCount) + ".txt"LoopOpen StrFileName For Output As #SaveFileId (打开指定文件用于存储接收到的数据)(保存文件头)Print #SaveFileId, "日期: ";Print #SaveFileId,Date(向应用程序目录下的保存文件输出日期)Print #SaveFileId, "时间: ";Print#SaveFileId, Time(向应用程序目录下的保存文件输出时间)Print #SaveFileId, TxtReceive.Text(向应用程序目录下的保存文件输出要保存的内容)Close#SaveFileId(关闭文件)。