嵌入式实验四:串口传输实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称嵌入式系统设计
实验仪器清华同方辰源嵌入式系统实验箱实验名称实验四:串口传输实验
系别计算机学院
专业计算机科学与技术
班级/学号
学生姓名
实验日期
成绩
指导教师
实验四:串口传输实验
一、实验问题回答
(1)本实验引入了Send和Receive两个变量表示上传或下传数据,用状态机怎么实现?
答:switch(oledkey[0])
{
case 'F':
state=1;
//Receive = 1;
//Send = 0;
break;
case 'E':
state=2;
//Send = 1;
//Receive = 0;
break;
switch(state)
{
case 0:
break;
case 1:
recive();
break;
case 2:
send();
break;
(2)了解串口通讯原理。
答:串口按位(bit)发送和接收字节,串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。
1、51系列单片机的串口有4个模式,可分别用作串并转换、并串转换、异步串行通信(2种模式)。异步串行通信中,有1+8+1和1+8+1+1两种帧格式,多机通信是特殊的通信方式。
2、基本原理是两组移位寄存器。将并行通信转换成串行通信模式(发送部分),或反之(接收部分)。可全双工运行。
3、速度通过移位脉冲决定。具体一般通过定时器1的自动装载模式产生的溢出脉冲给出。
4、电平上采用的是CMOS逻辑。
5、以上是物理层和数据链路层的单片机串口模块的约定,其他层需要软件人员根据需要自行把握。另外,电平需要根据实际通信环境做变换,如232、485或红外等。
(3)了解在上位机(PC端)端,C程序中如何调用串口?
答:#include
#include
HANDLE hCom;
int main(void)
{
hCom=CreateFile(TEXT("COM3"),//COM1口
GENERIC_READ|GENERIC_WRITE,//允许读和写
0,//独占方式
NULL,
OPEN_EXISTING,//打开而不是创建
0,//同步方式
NULL);
if(hCom==(HANDLE)-1)
{
printf("打开COM失败!\n");
return FALSE;
}
else
{
printf("COM打开成功!\n");
}
SetupComm(hCom,1024,1024);//输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts);//设置超时
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600;//波特率为9600
dcb.ByteSize=8;//每个字节有8位
dcb.Parity=NOPARITY;//无奇偶校验位
dcb.StopBits=ONE5STOPBITS;//两个停止位
SetCommState(hCom,&dcb);
DWORD wCount;//读取的字节数
BOOL bReadStat;
while(1)
{
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);//清空缓冲区
char str[9]={0};
printf("%s\n",str);
bReadStat=ReadFile(hCom,str,9,&wCount,NULL);
if(!bReadStat)
{
printf("读串口失败!");
return FALSE;
}
else
{
str[8]='\0';
printf("%s\n",str);
}
Sleep(100);
}
}
(4)了解在上位机(PC端)端,JAVA程序中如何调用串口?
答:public static void process() {
try {
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements())
{
CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)//如果端口类型是串口则判断名称
{
if(portId.getName().equals("COM1")){//如果是COM1端口则退出循