嵌入式实验四串口传输实验.docx
- 文档编号:10656058
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:33
- 大小:690.28KB
嵌入式实验四串口传输实验.docx
《嵌入式实验四串口传输实验.docx》由会员分享,可在线阅读,更多相关《嵌入式实验四串口传输实验.docx(33页珍藏版)》请在冰豆网上搜索。
嵌入式实验四串口传输实验
实验报告
课程名称嵌入式系统设计
实验仪器清华同方辰源嵌入式系统实验箱
实验名称实验四:
串口传输实验
系别计算机学院
专业计算机科学与技术
班级/学号
学生姓名
实验日期
成绩
指导教师
实验四:
串口传输实验
一、实验问题回答
(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)
{
case0:
break;
case1:
recive();
break;
case2:
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程序中如何调用串口?
答:
publicstaticvoidprocess(){
try{
EnumerationportList=CommPortIdentifier.getPortIdentifiers();
while(portList.hasMoreElements())
{
CommPortIdentifierportId=(CommPortIdentifier)portList.nextElement();
if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL)//如果端口类型是串口则判断名称
{
if(portId.getName().equals("COM1")){//如果是COM1端口则退出循环
break;
}else{
portId=null;
}
}
}
SerialPortserialPort=(SerialPort)portId.open("Serial_Communication",1000);//打开串口的超时时间为1000ms
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);//设置串口速率为9600,数据位8位,停止位1们,奇偶校验无
InputStreamin=serialPort.getInputStream();//得到输入流
OutputStreamout=serialPort.getOutputStream();//得到输出流
//进行输入输出操作
//操作结束后
in.close();
out.close();
serialPort.close();//关闭串口
}catch(PortInUseExceptione){
e.printStackTrace();
}catch(UnsupportedCommOperationExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
二、实验目的和效果
实验目的:
(1)学习、理解、掌握利用串口实现上位机和下位机之间的通讯(数据上传和控制)。
达到实验要求,拓展二未实现。
实验效果:
三、实验内容和步骤
实验内容:
(1)默认在在OLED屏幕上分行显示串口号、波特率、数据位、校验位、停止位、“E”键发送模式、“F”键接收模式。
思路:
E键发送模式设置send=1receive=0F键接受模式设置send=0receive=1
(2)按下小键盘的“E”键,表示下位机(实验箱)往上位机(PC)发送数据,上位机开启“超级终端”,下位机循环往上位机发送“0”“1”“2”。
。
。
“9”字符,上位机在“超级终端”中可以看到。
思路:
定义一个全局变量字符数组,charrxchar[2];
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,GPIO_PIN_0);
SysCtlDelay(2000000);
UARTSend((unsignedchar*)&rxchar,1);
SysCtlDelay(2000000);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0);
rxchar[0]值不断由0x30-0x39之间进行变化。
if((rxchar[0]>=0x39)||(rxchar[0]<0x30))
rxchar[0]=0x30;
else
rxchar[0]++;
(3)按下小键盘的“F”键,表示上位机(PC)往下位机(实验箱)发送数据,上位机开启“超级终端”,输入“A”、“B”、“C”、“D”等,下位机接受数据,和小键盘输入一样进行相应显示。
思路:
if(UARTCharsAvail(UART0_BASE))
{
rxchar[0]=UARTCharGet(UART0_BASE);//等待接收字符
rxchar[1]='\0';
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,GPIO_PIN_0);
RIT128x96x4StringDraw("Receive:
",12,80,15);
RIT128x96x4StringDraw(rxchar,66,80,15);
RIT128x96x4StringDraw("",72,80,15);
SysCtlDelay(1000000);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0);
}
(4)扩展:
按照状态机模式修改程序。
思路:
根据按键的不同判断状态,三种状态,空闲,接收,发送。
根据状态的不同调用相应的方法。
(5)扩展:
在另外一片CPULM3S2110上实现串口通信,接实验箱第二个串口接口,因为这一片CPU不带显示器,可以只实现下位机(实验箱)往上位机(PC)发送数据,上位机开启“超级终端”,下位机循环往上位机发送“0”“1”“2”。
。
。
“9”字符,上位机在“超级终端”中可以看到。
思路:
理论上在创建项目时选择cpuLM3S2110,改变实验箱上连线,连接UART2的串口即可实现。
但实际操作中并未实现。
实验步骤:
(1)加载必要程序
(2)串口启动配置(main)
(3)增加串口相关函数(main.c中)
(4)修改主函数,实现本次实验要求的功能
(5)编译、连接,生成可执行程序文件
(6)反复(3)--(5)步骤,直到完成
(7)硬件连接,连接标志UART1的串口
(8)联调
四、实验总结与收获
实验代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"rit128x96x4.h"
//#include"utility.h"
#defineMAX_SIZE40//缓冲区最大限制长度
#defineUARTCharGetNBUARTCharGetNonBlocking
charRxBuf[1+MAX_SIZE];//接收缓冲区
intBufP=0;//缓冲区位置变量
tBooleanRxEndFlag=false;//接收结束标志
unsignedintEvent=0,Event_key=0,Send=0,Receive=0;
inttype=0;
intki=0;
charoledkey[2];
intstate=0;
unsignedcharucValue=0x00;
longtime=0;
intSpeed,count=0;
unsignedcharrxchar[10];
voidtimerset(void);
voidUARTSend(constunsignedchar*pucBuffer,unsignedlongulCount);
voidrecive(){
if(UARTCharsAvail(UART0_BASE))
{
rxchar[0]=UARTCharGet(UART0_BASE);//等待接收字符
rxchar[1]='\0';
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,GPIO_PIN_0);
RIT128x96x4StringDraw("Receive:
",30,80,15);
RIT128x96x4StringDraw(rxchar,66,80,15);
RIT128x96x4StringDraw("",72,80,15);
SysCtlDelay(100000);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0);
}
}
voidsend(){
RIT128x96x4StringDraw("sending1",0,60,15);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,GPIO_PIN_0);
SysCtlDelay(200000);
//RIT128x96x4StringDraw("sending2",20,1,15);
UARTSend((unsignedchar*)&rxchar,1);
SysCtlDelay(200000);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0);
if((rxchar[0]>=0x39)||(rxchar[0]<0x30))
rxchar[0]=0x30;
else
rxchar[0]++;
RIT128x96x4StringDraw("sended",1,1,15);
}
intmain(){
//声明部分
rxchar[0]=0x30;
rxchar[1]='\0';
//初始化
/*SettheclockingtorunfromPLLat50MHz*/
SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_8MHZ);
RIT128x96x4Init(1000000);
RIT128x96x4Clear();
//设置时钟中断1
SysTickPeriodSet(SysCtlClockGet()/100);
SysTickEnable();
SysTickIntEnable();
//******************************
//设置键盘中断
/*使能外设GPIO*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
/*设置GPIO为输入*/
GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_7);
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4);
/*配置GPIO端口为输出
//7segd1(PB6);7segd2(PB4);7segd3(PB5)
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
//bitcode0(PC5);bitcode1(PC6);bitcode2(PC7)
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
//7segd0(PD4);7segdot(PD5);rst(PD6)
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);*/
/*使能中断*/
IntEnable(INT_GPIOD);
IntMasterEnable();
GPIOPinIntEnable(GPIO_PORTD_BASE,GPIO_PIN_7);
GPIOIntTypeSet(GPIO_PORTD_BASE,GPIO_PIN_7,GPIO_RISING_EDGE);
//*************************************
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_0);
GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);
//ConfiguretheUARTfor115,200,8‐N‐1operation.
UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),115200,
(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|
UART_CONFIG_PAR_NONE));
UARTFIFOLevelSet(UART0_BASE,//设置发送和接收FIFO深度
UART_FIFO_TX4_8,
UART_FIFO_RX6_8);
IntEnable(INT_UART0);
UARTIntEnable(UART0_BASE,UART_INT_RX|UART_INT_RT);
timerset();//计时器初始化
timerset();//计时器初始化
RIT128x96x4StringDraw("com1",0,0,15);//显示串口号
RIT128x96x4StringDraw("115200",0,20,15);//显示波特率
/*unsignedchara=*pulConfig;
chard[30];
charb[30];
d=*a+1;
b=*a+2;*/
RIT128x96x4StringDraw("8",0,40,15);//显示数据位
//unsignedlongparity=UARTParityModeGet(UART0_BASE);
//sprintf(p,"%d",parity);
RIT128x96x4StringDraw("wu",0,60,15);//显示校验位
RIT128x96x4StringDraw("1",0,80,15);//显示停止位
RIT128x96x4StringDraw("E:
send",1,31,15);
RIT128x96x4StringDraw("F:
receiave",1,41,15);
while
(1)
{
if(Event)
{
Event=0;
}
if(Event_key)
{
Event_key=0;
switch(oledkey[0])
{
/*case'0':
Draw_Char_H(0);
break;
case'1':
Reset_Counter_Speed(128);
Speed=128;
break;
*/case'F':
state=1;
//Receive=1;
//Send=0;
break;
case'E':
state=2;
//Send=1;
//Receive=0;
break;
default:
state=0;
break;
}
}
switch(state)
{
case0:
break;
case1:
recive();
break;
case2:
send();
break;
default:
//state=0;
break;
}
/*if(Send)
{
RIT128x96x4StringDraw("sending1",0,60,15);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,GPIO_PIN_0);
SysCtlDelay(200000);
//RIT128x96x4StringDraw("sending2",20,1,15);
UARTSend((unsignedchar*)&rxchar,1);
SysCtlDelay(200000);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0);
if((rxchar[0]>=0x39)||(rxchar[0]<0x30))
rxchar[0]=0x30;
else
rxchar[0]++;
RIT128x96x4StringDraw("sended",1,1,15);
}
if(Receive)
{
if(UARTCharsAvail(UART0_BASE))
{
rxchar[0]=UARTCharGet(UART0_BASE);//等待接收字符
rxch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 串口 传输