实验2 基于停等流量控制的串口通信
- 格式:doc
- 大小:168.00 KB
- 文档页数:6
串口实验实验报告串口实验报告一、引言串口是一种常见的数据传输接口,广泛应用于电子设备之间的数据通信。
本次实验旨在通过串口通信实验,深入了解串口的工作原理和使用方法,并实现简单的数据传输。
二、实验目的1. 理解串口通信的基本原理;2. 掌握串口通信的硬件连接方式;3. 学会使用串口通信协议进行数据传输;4. 实现简单的串口通信程序。
三、实验器材1. 一台个人电脑;2. 一块开发板;3. 一条串口数据线。
四、实验步骤1. 将开发板与个人电脑通过串口数据线连接起来;2. 打开串口通信软件,并进行相应的设置;3. 在开发板上编写程序,实现数据的发送和接收;4. 在个人电脑上编写程序,实现数据的接收和显示;5. 进行数据传输实验,观察数据是否能正常传输。
五、实验结果与分析经过实验,我们成功地实现了串口通信,并能够正常地进行数据传输。
通过观察数据接收端的显示,我们可以清晰地看到发送端发送的数据被准确地接收并显示出来。
这说明我们的串口通信实验是成功的。
六、实验总结通过本次实验,我们深入了解了串口通信的原理和使用方法,并成功地实现了串口通信的数据传输。
串口通信在电子设备之间的数据传输中有着广泛的应用,掌握串口通信技术对于我们的学习和工作都具有重要的意义。
七、参考文献[1] XXXX. 串口通信原理与应用[M]. 电子工业出版社, 2010.八、致谢感谢实验中给予我们帮助和指导的老师和同学们,没有你们的支持,我们无法顺利完成本次实验。
九、附录实验中使用的程序代码如下:发送端代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <Windows.h>int main(){HANDLE hSerial;DCB dcbSerialParams = { 0 };COMMTIMEOUTS timeouts = { 0 };// 打开串口hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hSerial == INVALID_HANDLE_VALUE){printf("无法打开串口\n");return 1;}// 配置串口参数dcbSerialParams.DCBlength = sizeof(dcbSerialParams);if (!GetCommState(hSerial, &dcbSerialParams)) {printf("无法获取串口参数\n");return 1;}dcbSerialParams.BaudRate = CBR_9600;dcbSerialParams.ByteSize = 8;dcbSerialParams.StopBits = ONESTOPBIT;dcbSerialParams.Parity = NOPARITY;if (!SetCommState(hSerial, &dcbSerialParams)) {printf("无法设置串口参数\n");return 1;}// 设置串口超时时间timeouts.ReadIntervalTimeout = 50;timeouts.ReadTotalTimeoutConstant = 50;timeouts.ReadTotalTimeoutMultiplier = 10;timeouts.WriteTotalTimeoutConstant = 50;timeouts.WriteTotalTimeoutMultiplier = 10;if (!SetCommTimeouts(hSerial, &timeouts)){printf("无法设置串口超时时间\n");return 1;}// 发送数据char data[] = "Hello, Serial!";DWORD bytesWritten;if (!WriteFile(hSerial, data, strlen(data), &bytesWritten, NULL)){printf("无法发送数据\n");return 1;}// 关闭串口CloseHandle(hSerial);return 0;}```接收端代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <Windows.h>int main(){HANDLE hSerial;DCB dcbSerialParams = { 0 };COMMTIMEOUTS timeouts = { 0 };// 打开串口hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hSerial == INVALID_HANDLE_VALUE){printf("无法打开串口\n");return 1;}// 配置串口参数dcbSerialParams.DCBlength = sizeof(dcbSerialParams);if (!GetCommState(hSerial, &dcbSerialParams)){printf("无法获取串口参数\n");return 1;}dcbSerialParams.BaudRate = CBR_9600;dcbSerialParams.ByteSize = 8;dcbSerialParams.StopBits = ONESTOPBIT;dcbSerialParams.Parity = NOPARITY;if (!SetCommState(hSerial, &dcbSerialParams)) {printf("无法设置串口参数\n");return 1;}// 设置串口超时时间timeouts.ReadIntervalTimeout = 50;timeouts.ReadTotalTimeoutConstant = 50;timeouts.ReadTotalTimeoutMultiplier = 10;timeouts.WriteTotalTimeoutConstant = 50;timeouts.WriteTotalTimeoutMultiplier = 10;if (!SetCommTimeouts(hSerial, &timeouts)){printf("无法设置串口超时时间\n");return 1;}// 接收数据char data[100];DWORD bytesRead;if (!ReadFile(hSerial, data, sizeof(data), &bytesRead, NULL)){printf("无法接收数据\n");return 1;}// 显示接收到的数据printf("接收到的数据:%s\n", data);// 关闭串口CloseHandle(hSerial);return 0;}```十、联系方式作者:XXXEmail:XXX。
实验2:串行端口程序设计一、实验目的了解在linux环境下串行程序设计的基本方法。
掌握终端的主要属性及设置方法,熟悉终端I /O函数的使用。
学习使用多线程来完成串口的收发处理。
二、实验内容读懂程序源代码,学习终端I /O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
三、预备知识有C语言基础。
掌握在Linux下常用编辑器的使用。
掌握Makefile 的编写和使用。
掌握Linux下的程序编译与交叉编译过程四、实验设备及工具硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium 500以上, 硬盘10G以上。
软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环境五、实验原理异步串行I /O方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图2.3.1串行通信字符格式图2.3.1给出异步串行通信中一个字符的传送格式。
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。
每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。
实验2:可靠数据传输协议-停等协议的设计与实现
1.实验目的
理解可靠数据传输的基本原理;掌握停等协议的工作原理;掌握基于 UDP 设计并实现一个停等协议的过程与技术。
2.实验环境
接入Internet的实验主机;
Windows xp或Windows7/8;
开发语言:python。
3.实验内容
1)基于 UDP 设计一个简单的停等协议,实现单向可靠数据传输(服务器到客户的数据传输)。
2)模拟引入数据包的丢失,验证所设计协议的有效性。
4.程序设计
在实验报告中要说明所设计停等各个域作用,协议两端程序流程图,协议典型交互过程,数据分组丢失验证模拟方法,程序实现的主要类(或函数)及其主要作用、UDP 编程的主要特点、实验验证结果,详细注释源程序等。
1)协议主要数据结构:
客户端:
服务器:
数据包格式:分为数据分组和确认分组
-数据分组:为数据分组序号后面加上数据内容,如‘0HELLO’
-确认分组:为确认类型与确认分组号,如‘ACK0’。
为了实现丢包,增加NAK类型,如‘NAK0’。
2)协议两端程序流程图:客户端:
服务器:
3)UDP编程的主要特点:
-在python3中,能传输的只有比特字符串,因此要加以转换
-由于是网络编程,很可能发生各种异常,有必要进行捕捉并处理。
串口通信实验报告串口通信实验报告一、引言串口通信是一种常用的数据传输方式,广泛应用于计算机与外部设备之间的数据交互。
本实验旨在通过对串口通信的实际操作,掌握串口通信的基本原理和实现方法。
二、实验目的1. 理解串口通信的基本原理;2. 学会使用串口通信的相关指令和函数;3. 掌握串口通信的实际应用。
三、实验器材与软件1. 单片机开发板;2. 电脑;3. 串口线;4. 串口调试助手软件。
四、实验步骤1. 连接单片机开发板和电脑,使用串口线将它们连接起来;2. 打开串口调试助手软件,设置串口参数(波特率、数据位、停止位等);3. 在单片机开发板上编写相应的程序,实现串口通信功能;4. 将程序下载到单片机开发板上,并启动程序;5. 在串口调试助手软件中发送数据,并观察单片机开发板上的反应;6. 分析实验结果,总结串口通信的特点和应用。
五、实验结果与分析经过实验,我们成功地实现了串口通信功能。
在串口调试助手软件中发送数据时,单片机开发板能够正确接收并处理数据,并作出相应的反馈。
通过实验结果的分析,我们可以得出以下结论:1. 串口通信具有较高的可靠性和稳定性,适用于长距离数据传输;2. 串口通信的速度较慢,适用于对数据传输速度要求不高的场景;3. 串口通信可以实现双向数据传输,方便实现设备之间的数据交互。
六、实验心得本次实验让我对串口通信有了更深入的了解。
通过实际操作,我掌握了串口通信的基本原理和实现方法,并学会了使用串口调试助手软件进行串口通信调试。
在实验过程中,我遇到了一些问题,例如串口参数设置不正确导致通信失败等。
但通过不断调试和排查,最终成功解决了这些问题。
这让我更加明白了实验的重要性,只有亲自动手去实践,才能真正掌握知识。
通过这次实验,我还意识到串口通信在现实生活中的广泛应用。
无论是计算机与外部设备的数据交互,还是嵌入式系统的开发,串口通信都扮演着重要的角色。
因此,掌握串口通信技术对于我们的学习和工作都具有重要意义。
串口通信基本连线操作以及流控制方式目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。
最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。
1.DB9和DB25的常用信号脚说明9针串口(DB9)25针串口(DB25)针号功能说明缩写针号功能说明缩写1 数据载波检测DCD 8 数据载波检测DCD2 接收数据RXD3 接收数据RXD3 发送数据TXD 2 发送数据TXD4 数据终端准备DTR 20 数据终端准备DTR5 信号地GND 7 信号地GND6 数据设备准备好DSR 6 数据准备好DSR7 请求发送RTS 4 请求发送RTS8 清除发送CTS 5 清除发送CTS9 振铃指示DELL 22 振铃指示DELL2.RS232C串口通信接线方法(三线制)首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连·同一个串口的接收脚和发送脚直接用线相连对9针串口和25针串口,均是2与3直接相连;·两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口)上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼此交叉,信号地对应相接,就能百战百胜。
3.串口调试中要注意的几点:串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果;强烈建议不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。
单工、半双工和全双工的定义如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。
基于停等式协议的RS232双机通信系统设计报告摘要:串行通信是单片机的一个重要应用。
本次综合开发实验就是要利用单片机来完成一个系统,实现双片单片机串行通信。
通信的结果实用数码管进行显示,为便于观察理解停等式ARQ协议,分别在主从机设置了一个确认按键和从发按键。
两个单片机之间采用RS232进行双机通信。
在通信过程中,使用停等式ARQ通信协议进行通信。
关键字:通信单片机停等式ARQ RS232 串行通信一、总体设计 (3)1.设计思想 (3)2.设计方案 (3)3.停等式ARQ协议原理 (3)二、硬件设计 (7)1.51单片机串行通信功能 (7)2.MAX232芯片 (9)3.数码管的选择 (10)4.电源模块 (12)5.RS232串行线 (12)6.整体电路设计 (13)三、软件设计 (14)1.串行通信软件实现 (14)2.奇偶校验的软件实现 (15)3.程序流程图 (17)发送端程序流程图 (17)接收方程序流程图 (18)4.程序设计算法: (18)5.C51程序 (19)四、加电调试 (30)五、改进与不足 (33)六、元件清单 (34)一、总体设计1.设计思想:两片单片机之间进行串行通信,发送端通过按键将1~8发送到接收端,并在接收端显示。
同时在发端进行定时,黄灯亮,等待确认信息,5秒后重发,蜂鸣器响。
收端收到后进行奇偶校验并点亮相应的灯(正确的绿灯、错误的红灯)。
收端通过确认按键将确认信息发送到发端,发端点亮相应的灯,若传输出错,则发端通过重发按键重发。
2.设计方案:本次设计,对于两片89C51,采用RS232进行双机通信。
发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS232电平输出,经过传输线将信号传送到接收端。
接收方也使用MAX232芯片进行电平转换后,信号到达接收方串行口的接收端。
接受方接收后,在数码管上显示接收的信息。
为提高抗干扰能力,还可以在输入输出端加光耦合进行光电隔离。
实验2:
利用停止等待协议传输数据文件
1、停止等待协议:
停止等待协议:一种最简单的(但效率较低的)差错和流量控制协议 基本原理:发送方发完一数据包后,需要等待接收方的应答信息
● 发送方收到正确认信息ACK:接收方接收正确,发送方可发送下一数据包 ● 发送方收到负确认信息NAK:接收方接收错误,发送方应重发出错的数据包
2、停止等待协议的基本工作过程
数据包丢失:
数据包在传输过程中丢失,接收方未接收到任何数据 ● 发送方在发送数据包后启动定时器
● 规定时间内没有收到确认信息,则认为数据包丢失,需重传该包 ● 重传次数达到一定的值,则数据传输失败
发送方接收方发送数据包1发送数据包2接收数据包1正确发送正确认ACK 接收正确认ACK
接收数据包2错误发送负确认NAK 重发数据包2
接收负确认NAK
接收数据包2正确发送正确认ACK 发送数据包3接收正确认ACK 接收数据包3正确发送正确认ACK 接收正确认
ACK
停止等待协议BSC:
●BSC:一种典型的面向字符型停止等待协议
●BSC:使用ASCII码中的10个控制字符完成通信控制功能
●BSC:规定了数据报文、控制报文的格式
●BSC:规定了协议的操作过程
●特点:规程简单、容易实现,比较适宜于在中低速网络中使用控制字符:
报文格式:
●数据报文
●常用的控制报文
确认: SYN SYN 0/1 ACK
否认: SYN SYN NAK
询问: SYN SYN ENQ
传输结束: S YN SYN EOT
透明数据传输:
为什么提出透明数据传输?
BSC中的数据以字符为单位
数据字符与控制字符有可能相同
解决方法:
转义字符DLE
如果数据字符与控制字符相同,则在数据字符前增加DLE
DLE也是控制字符,正文中出现DLE时也需要增加DLE BSC协议的执行过程:
停止等待协议编程实验
在异步串行口上实现停等协议,实现文件的可靠传输
简化的停止等待协议:
●目的:在不影响停等协议基本思想的基础上简化编程和实验过程
●简化后使用的控制字符:STX、ETX、EOT、ENQ、ACK和DLE
●简化后的数据报文格式
界面示意图:
选择发送和接收文件:
explicit CFileDialog(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONL Y | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0);
CString FileName;
CFileDialog GetFileName(TRUE,
NULL,
NULL,
OFN_HIDEREADONL Y,
"文本文件(*.txt)|*.txt||",
NULL,
0);
if (GetFileName.DoModal()==IDOK)
FileName=GetFileName.GetPathName();
磁盘文件操作:
virtual BOOL Open(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CFileException* pError = NULL );
virtual UINT Read(
void* lpBuf,
UINT nCount );
virtual void Write(
const void* lpBuf,
UINT nCount );
virtual void Close( );
CFile rwFile; //需要读取的文件
char Buf[BUFFER_SIZE]; //读取和写入缓冲区
int len,Len;
if (!rwFile.Open(FileName,
CFile::modeRead| CFile::modeWrite| CFile::typeBinary,
NULL)) //打开文件
{
……//错误处理
}
……
rwFile.Write(Buf, len); //将缓冲区Buf中len个字节写入文件
……
len=rwFile.Read(Buf,Len); //从文件中读取Len个字节的数据放入Buf中
//返回的len为实际读到的字节数
RecvFile.Close (); //关闭文件,文件操作结束。