第一篇:嵌入式串口和网络编程实验报告
嵌入式实验报告
题目:linux
串口和网络编程
一、实验目的:
1、强化本学期所学的相关的内容。
2、掌握串口相关设置。
3、强化基于TCP网络传输的三次握手。
4、自学Linux线程的使用。
二、实验内容:
本试验基于server和client的透明传输来实现类似于QQ的聊天功能。
三、实验过程:
1、linux开发环境的建立
2、嵌入式linux系统的搭建
1>BootLoader的移植
2>linux系统的裁剪与移植 Linux内核裁剪
./make_image生成自己的uImage2638
上电验证:
3>根文件系统的移植 修改hostname为:whmtt
./mkcramfsdisk_new 生成rootfs_new.cramfs
大小从老师给的40000到37b00(因为有的没有用到,大小变小了):
上电验证:
3、客服端编程client.c 相关代码: #include
#define SERVER_PORT 20000 //设置服务端口
#define CLIENT_PORT((20001+rand())%65536)//设置客户端端口(随机)#define BUFFER_SIZE 256 #define LENGTH_OF_LISTEN_QUEUE 10 //可窃听队列长为10 #define WELCOME_MESSAGE “welcome to connect the server.”
void usage(char* name){ printf(“usage: %s IpAddrn ” ,name);}
struct sockaddr_in servaddr,cliaddr;int servfd,clifd,length=0;struct sockaddr_in servaddr,cliaddr;socklen_t socklen=sizeof(servaddr);char buf[BUFFER_SIZE],buf2[BUFFER_SIZE];pthread_t tidp,tidp2;int pth;int runflag=0;
void *Thread1(void *arg)/*等待runflag为1,当为1时清空buf,同时接收来自server的数据并输出。
但当没有清空,则break.*/ { while(runflag){
memset(buf,0,BUFFER_SIZE);
length=recv(clifd,buf,BUFFER_SIZE,0);
if(strstr(buf,“$”)>0){runflag=0;printf(“stop!n”);break;}
if(length>0)printf(“from server:%s”,buf);
} }
void *Thread2(void *arg)/*等待发送数据给Server*/ { printf(“Please input your words to Server:--$ to stopn”);while(runflag){
memset(buf2,0,BUFFER_SIZE);
scanf(“%s”,buf2);
send(clifd,buf2,strlen(buf2),0);
if(strstr(buf2,“$”)>0){runflag=0;printf(“stop!n”);break;}
} }
int main(int argc, char** argv){ if(argc < 2){
usage(argv[0]);
exit(1);} if((clifd = socket(AF_INET,SOCK_STREAM,0))< 0)//用tcp定义socket {
printf(“ create socket error!n ”);
exit(1);}
srand(time(NULL));// initialize random generator
bzero(& cliaddr, sizeof(cliaddr));cliaddr.sin_family = AF_INET;cliaddr.sin_port = htons(CLIENT_PORT);cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
if(bind(clifd,(struct sockaddr*)&cliaddr,sizeof(cliaddr))< 0){
printf(“bind to port %d failure!n ” ,CLIENT_PORT);
exit(1);}//绑定的目的是让其端口是随机的,否则端口是自增1 //一般情况下client端不用绑定
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;inet_aton(argv[1], &servaddr.sin_addr);servaddr.sin_port = htons(SERVER_PORT);
if(connect(clifd,(struct sockaddr *)&servaddr, socklen)< 0){
printf(“can't connect to %s!n”, argv[1]);
exit(1);}
runflag=1;
pth=pthread_create(&tidp,NULL,Thread1,NULL);
if(pth!=0){printf(“error!”);return-1;}
pth=pthread_create(&tidp2,NULL,Thread2,NULL);
if(pth!=0){printf(“error!”);return-1;}
pthread_detach(tidp);
pthread_detach(tidp2);
while(runflag){;}
close(clifd);
return 0;}
4、服务端server.c编写
相关代码: #include #define COM0 0 #define BLOCK_MODE 1 #define NONBLK_MODE 0 #define SERVER_PORT 20000 #define LENGTH_OF_LISTEN_QUEUE 10 #define QUEUE 20 #define BUFFER_SIZE 256 #define WELCOME_MESSAGE “welcome to connect the server.” static struct termios g_newtio,g_oldtio; static int speed_arr[] = { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300, B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300, }; static int name_arr[] = { 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300, 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300, }; int Init_COM(int Comm,int Baudrate,int Parity,int Stopbit,int Flagblock){ int ret,i;char dev_buf[16]; if(Comm > 3){ printf(“Com%d not existn”,Comm); return-1;} memset(dev_buf,0x00,sizeof(dev_buf));sprintf(dev_buf,“/dev/ttyS%d”,Comm); if(Flagblock){ ret = open(dev_buf, O_RDWR | O_NOCTTY);//以默认阻塞方式打开 } else { ret = open(dev_buf, O_RDWR | O_NOCTTY | O_NONBLOCK);//以非阻塞方式打开 } if(ret < 0){ printf(“Open ttyS%d failedn”,Comm); return-1; } if(tcgetattr(ret, &g_oldtio)< 0)//保存原先的端口 { printf(“Get Com Parameter Error.n”); return-1;} for(i= 0;i < sizeof(speed_arr)/ sizeof(int);i++){ if(Baudrate == name_arr[i]) { cfsetispeed(&g_newtio,speed_arr[i]);/*设置输入输出波特率*/ cfsetospeed(&g_newtio,speed_arr[i]); break; } } if(i>=sizeof(speed_arr)/ sizeof(int)){ printf(“Unsupported Speed!n”); return-1;} switch(Parity){ case 'n': case 'N': g_newtio.c_cflag &= ~PARODD; g_newtio.c_cflag &= ~PARENB; break; case 'o': case 'O': g_newtio.c_cflag |= PARENB; g_newtio.c_cflag |= PARODD;//奇校验 break; case 'e': case 'E': g_newtio.c_cflag |= PARENB;//偶校验 g_newtio.c_cflag &= ~PARODD; break; default: printf(“Unsupported Parityn”); return-1;} switch(Stopbit)//设置停止校验位是为2,否为1.{ case 1: g_newtio.c_cflag &= ~CSTOPB; break; case 2: g_newtio.c_cflag |= CSTOPB; break; default: printf(“Unsupported Stopbit!n”); return-1;} g_newtio.c_iflag = 0;g_newtio.c_oflag = 0;g_newtio.c_lflag = 0; g_newtio.c_cc[VTIME] = 1;//最大等待时间为1*100ms g_newtio.c_cc[VMIN] = 1;//最小读数为1 g_newtio.c_iflag &= ~INPCK;g_newtio.c_cflag &= ~CRTSCTS;g_newtio.c_cflag &= ~CSIZE;//设置数据位 g_newtio.c_cflag |= CS8;// g_newtio.c_cflag |= CLOCAL;g_newtio.c_cflag |= CREAD; if(tcsetattr(ret, TCSANOW, &g_newtio)!= 0)//激活设置 { printf(“Set Com Parameter Error!n”); return-1;} tcflush(ret, TCIOFLUSH);//刷新输入输出缓存 return ret;} //以上为套接字的相关定义 //一下类似与client一样设置数据接收和发送。 void RestoreComConfiguration(int fd,struct termios *ptios){ if(tcsetattr(fd, TCSANOW, ptios)!= 0){ printf(“Restore Com Parameter Error!n”);} } int fd;char buf[1024],buf2[1024];int servfd,clifd; struct sockaddr_in servaddr,cliaddr;int runflag=0; void *Thread1(void *arg){ printf(“Please input your words to Server:--$ to stopn”);while(runflag){ memset(buf,0,BUFFER_SIZE); read(fd,buf,1024); send(clifd,buf,strlen(buf),0); if(strstr(buf,“$”)>0){runflag=0;printf(“stop!n”);break;} } } void *Thread2(void *arg){ int length=0;while(runflag){char stdstr[1024]=“from client:”; memset(buf2,0,BUFFER_SIZE); length=recv(clifd,buf2,1024,0);if(length>0){ strcat(stdstr,buf2);strcat(stdstr,“n”); if(strstr(buf2,“$”)>0) {runflag=0;printf(“stop!n”);break;} write(fd,stdstr,strlen(stdstr)); } } } void socket_init(void){ if((servfd=socket(AF_INET,SOCK_STREAM,0))<0){printf(“create socket error!n”);exit(1);} bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(SERVER_PORT);servaddr.sin_addr.s_addr=htons(INADDR_ANY);if(bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){printf(“bind to port %d failure!n”,SERVER_PORT);exit(1);} if(listen(servfd,QUEUE)<0){printf(“call listen failure!n”);exit(1);} socklen_t length=sizeof(cliaddr);clifd=accept(servfd,(struct sockaddr*)&cliaddr,&length);if(clifd<0){ printf(“error comes when call accept!n”);exit(1);} } int main(int argc,char *argv[]){ fd = Init_COM(COM0,115200,'N',1,BLOCK_MODE);socket_init();pthread_t tidp,tidp2;int pth;if(fd >= 0)RestoreComConfiguration(fd,&g_oldtio); runflag=1; pth=pthread_create(&tidp,NULL,Thread1,NULL); if(pth!=0){printf(“error!”);return-1;} pth=pthread_create(&tidp2,NULL,Thread2,NULL); if(pth!=0){printf(“error!”);return-1;} pthread_detach(tidp); pthread_detach(tidp2); while(runflag){;} close(clifd);close(fd);close(servfd);//全部关闭 return 0;} 编译结果: 5、nfs挂载 四、实验结果: 五、心得体会: 实验一 TCP Socket API程序设计 一、预备知识 1.网络编程基本概念 网络上的计算机间的通讯,实质上是网络中不同主机上的程序之间的通讯。在互联网中使用IP地址来标识不同的主机,在网络协议中使用端口号来标识主机上不同进程,即使用(IP地址,端口号)二元组。 套接字(Socket)用于描述IP地址和端口,是一个通信链的句柄,通信时一个网络程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡相连的传输介质将这段信息发送到另一台主机的Socket中,以供其他程序使用。 图1-1 TCP通信流程 2.TCP通信流程 TCP程序是面向连接的,程序运行后,服务器一直处于监听状态,客户端与服务器通信之前必须首先发起连接请求,由服务器接收请求并在双方之间建立连接后才可以互相通信。 二、实验目的 1.了解Winsock API编程原理; 2.掌握TCP Socket程序的编写; 3.了解C/S模式的特点; 4.学会解决实验中遇到的问题。 三、实验任务 使用Winsock API相关类实现TCP Socket通信程序,并能成功运行。 四、实验环境及工具 1.Windows2000/XP/7 2.Visual C++开发平台 3.Visual Studio2010 五、实验内容和步骤 参照《Visual C++网络编程教程》书中81页,TCP Socket API程序设计。连接: void CChatClientDlg::OnConnect(){ WSADATA wsd; //WSADATA结构 WSAStartup(MAKEWORD(2,2),&wsd); //加载协议,使用Winsock 2.2版 m_client = socket(AF_INET,SOCK_STREAM,0);//创建流式套接字 //服务器地址 sockaddr_in serveraddr; UpdateData(); if(ServerIP.IsBlank()) { AfxMessageBox(“请指定服务器IP!”); return; } if(sPort.IsEmpty()) { AfxMessageBox(“请指定端口!”); return; } //获取服务器进程的IP和端口 BYTE nFild[4]; CString sIP; ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]); sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]); //设置服务器地址结构的内容 serveraddr.sin_family = AF_INET; serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP); serveraddr.sin_port = htons(atoi(sPort)); //发起连接须指明要访问的服务器进程地址,这个地址存储在serveraddr中 if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr))!= 0) { MessageBox(“连接失败”); return; } else { m_ListWords.AddString(“连接服务器成功!”); m_ListWords.SetTopIndex(m_ListWords.GetCount()1); ServerIP.EnableWindow(); ServerPort.EnableWindow(); m_ButtonConnect.EnableWindow(); m_ButtonDisconnect.EnableWindow(false); m_EditWords.EnableWindow(false); m_ButtonSend.EnableWindow(false); m_ButtonExit.EnableWindow();} “发送”按钮事件过程代码如下: void CChatClientDlg::OnSend(){ //向服务器发送信息 UpdateData(); if(m_sWords.IsEmpty()) { AfxMessageBox(“发送的消息不能为空!”); return; } //开始发送数据 int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0); m_ListWords.AddString(“发送:” + m_sWords); m_ListWords.SetTopIndex(m_ListWords.GetCount()1); closesocket(m_client); ServerIP.EnableWindow(); ServerPort.EnableWindow(); m_ButtonConnect.EnableWindow(); m_ButtonDisconnect.EnableWindow(false); m_EditWords.EnableWindow(false); m_ButtonSend.EnableWindow(false); m_ButtonExit.EnableWindow();} “清空”按钮的事件过程: m_ListWords.ResetContent();“关于”按钮的事件过程: CAboutDlg dlgAbout;dlgAbout.DoModal(); 服务器端: 开始监听代码: void CChatServerDlg::OnListen(){ WSADATA wsd; //WSADATA结构 WSAStartup(MAKEWORD(2,2),&wsd); //加载协议栈,使用Winsock 2.2版 m_server = socket(AF_INET,SOCK_STREAM,0);//创建流式套接字 //将网络中的事件关联到窗口的消息函数中,定义消息号为20000,侦测客户端的连接请求 WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT); m_client = 0; BYTE nFild[4]; CString sIP; UpdateData(); if(ServerIP.IsBlank()) { AfxMessageBox(“请设置IP地址!”); return; } if(sPort.IsEmpty()) { AfxMessageBox(“请设置监听端口!”); return; } ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]); sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]); //服务器地址 sockaddr_in serveraddr; serveraddr.sin_family = AF_INET; serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP); serveraddr.sin_port = htons(atoi(sPort)); //绑定地址 if(bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr))) { MessageBox(“绑定地址失败.”); return; } //监听开始,服务器等待连接请求的到来 listen(m_server,5); m_ListWords.AddString(“监听开始:”); m_ListWords.AddString(“地址” + sIP + “ 端口” + sPort); m_ListWords.AddString(“等待客户端连接„„”); //界面完善 m_ListWords.SetTopIndex(m_ListWords.GetCount()-1); ServerIP.EnableWindow(false); ServerPort.EnableWindow(false); m_ButtonListen.EnableWindow(false); m_ButtonStopListen.EnableWindow(); m_ButtonClear.EnableWindow(); m_ButtonExit.EnableWindow(false);} “停止监听”按钮事件过程代码如下: void CChatServerDlg::OnStopListen(){ //停止监听 closesocket(m_server); m_ListWords.AddString(“停止监听”); m_ListWords.SetTopIndex(m_ListWords.GetCount()1);} “断开”按钮事件过程代码如下: void CChatServerDlg::OnDisconnect(){ closesocket(m_client); m_ListWords.AddString(“与客户端断开”); m_ListWords.SetTopIndex(m_ListWords.GetCount()1); //界面完善 m_ButtonDisconnect.EnableWindow(); m_EditWords.EnableWindow(); m_ButtonSend.EnableWindow();} ReceiveData()函数代码如下: void CChatServerDlg::ReceiveData(){ //接收客户端的数据 char buffer[1024]; int num = recv(m_client,buffer,1024,0); buffer[num] = 0; CString sTemp; sTemp.Format(“收到:%s”,buffer); m_ListWords.AddString(sTemp);//显示信息 m_ListWords.SetTopIndex(m_ListWords.GetCount()1); closesocket(m_client);//关闭与客户端通信的Socket WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT);//准备接收新的客户端连接 //界面完善 m_ButtonDisconnect.EnableWindow(false); m_EditWords.EnableWindow(false); m_ButtonSend.EnableWindow(false);} 服务器的初始化代码如下: //界面初始化 m_ButtonStopListen.EnableWindow(false);m_ButtonDisconnect.EnableWindow(false);m_ButtonClear.EnableWindow(false);m_EditWords.EnableWindow(false);m_ButtonSend.EnableWindow(false); 运行结果: 六、思考题 1.用Winsock API编程时,主要进行哪些通行的操作步骤? 2.阐述C/S模式的通信过程。答: 1.通行的操作 1.Winsock的打开(WSAStartup())。2.建立套接字(socket()或WSASocket())。3.地址绑定(bind())。 4.服务器监听连接(listen())。 5.客户端提出连接申请(connect()或WSAConnect())。6.服务器接收客户端的连接请求(accept()或WSAAccept())。7.数据的发送(send()或WSASend(),sendto()或WSASendTo())。8.数据的接收(recv()或WSARecv(),recvfrom()或WSARecvfrom())。9.关闭套接字(closesocket())。10.关闭Winsock(WSACleanup())。 2通信过程 华南农业大学 实验报告 ----------目录---------- 1、实验任务和目的..............................................................................................................2、实验准备..........................................................................................................................3、实验步骤................................................................................................................................4、实验分析与总结....................................................................................................................(1)、分析.............................................................................................................................(2)、总结.............................................................................................................................1、实验任务和目的 了解串行通信的背景知识后,通过三线制制作一条串口通信线(PC-PC),并编程实现两台PC间通过RS-232C通信。要求两台PC机能进行实时的字符通信,并了解工业自动化控制中的基本通信方式。 2、实验准备 1、检查PC是否具有串行通信接口,并按其针脚类准备一条串口通信线缆。 2、串口包的安装,下载javacomm20-win32.zip并解压,将win32com.dll复制到 3、实验步骤 1、将实验所需RS-232缆线准备好,并将JAVA串口包复制到相应地目录下。 2、查找有关串口通信的书籍以及在网上查找相应地串口通信代码。 3、用JAVA编程软件JCreator编写代码。 4、实验分析与总结 (1)、分析 (I)、对串口读写之前需要先打开一个串口并检测串口是否被占用: public void open(){//打开串口以及输入输出流 recieve=false; try {serialPort=(SerialPort)portId.open(“Serial Communication”, 2000);} catch(PortInUseException e){System.out.println(“端口正被占用!”);} try {serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);} catch(UnsupportedCommOperationException e){System.out.println(“不支持通信”);} try { outputStream=serialPort.getOutputStream(); inputStream=serialPort.getInputStream(); 1-完整运行程序如图所示: 图1 (2)、总结 通过本次串口实验,我对串口通信的知识了解的更透彻,这是在刚开始对串口通信知识不了解的情况下就编程而造成许多错误之后才得到的结果。在网上查找资料的时候也接触到了不少其他的编程语言例如VB,delphi,C#等,这也让我对这些从没有学过的语言有所了解,我想这些知识对以后的实验工作都有帮助。 3-- 网络编程与实践实验报告 实验内容:串口通信编程 学号:S201502189 姓名:职荣豪 日期:2015-9-28 一、实验要求 使用VS2010编写基于对话框的MFC应用程序,两个窗口分别使用两个串口,使得这两个窗口可以进行通信,包括数据的发送与接收。 二、实验原理 本实验使用Microsoft Communications Control控件,利用这个ActiveX控件,只需要编写少量代码即可轻松进行通信。 该控件相关的函数如下: put__CommPort:设置串口号 put_Settings:以字符串的形式设置波特率、奇偶校验位(n-无校验,e-偶校验,o-奇校验)、数据位数、停止位数 put_InputMode:设置接收数据的类型(0-文本类型,1-二进制类型)put_InputLen:设置从接收缓冲区读取的字节数,0表示全部读取 put_InBufferSize:设置接收缓冲区大小 put_OutBufferSize:设置发送缓冲区大小 put_RThreshold:设定当接收几个字符时触发OnComm事件,0表示不产生事件,1表示每接收一个字符就产生一个事件 put_SThreshold:设定在触发OnComm事件前,发送缓冲区内所允许的最少的字符数,0表示发送数据时不产生事件,1表示当发送缓冲区空时产生OnComm事件 put_PortOpen:打开或关闭串口,传入参数为true时打开串口,传入参数为false时关闭串口 get_CommEvent:获得串口上刚发生的事件,事件值为2表示接收到数据 get_InBufferCount:获得缓冲区中的数据位数 get_Input:获取缓冲区数据,返回类型为VARIANT put_Output:发送数据 三、设计思路 需要添加一个Microsoft Communications Control控件,用于进行串口通信。由于要求同一程序可运行两个窗口进行相互通信,需要两个窗口开启两个不同串口,故需要添加一个Edit Control控件用于输入串口号,并添加打开串口按钮,在点击该按钮时对串口控件的参数进行设置并开启串口。同时添加关闭串口按钮,点击后关闭串口并可以对串口号进行修改。 需要添加两个Edit Control 分别用于显示接收到的数据以及输入要发送的数据。需要添加一个发送按钮,点击后发送输入的数据。 四、实验步骤 1.建立基于对话框的MFC应用程序 2.添加界面控件并设置ID与Caption 添加Microsoft Communications Control控件,用于进行串口通信 添加一个Edit Control控件,用于输入串口号,ID设置为IDC_PORT 添加一个Static Text控件,用于标注端口号,将Caption设置为“串口号:” 添加两个按钮,分别用于打开串口、关闭串口。IDC分别设置为IDC_BTN_OPEN、IDC_BTN_CLOSE,Caption分别设置为“打开”、“关闭” 添加两个Edit Control,分别用于显示接收到的数据以及输入要发送的数据,ID分别设置为IDC_RECEIVE、IDC_SEND 添加两个Static Text控件,用于标注接收区与发送区,Caption分别设置为“接收区”、“发送区” 添加一个按钮用于发送数据,ID设置为IDC_BTN_SEND,Caption设置为“发送” 调整控件的大小与位置。 完成后如图: 3.给控件绑定变量 右键单击Microsoft Communications Control控件,选择“添加变量”,变量名为m_com 打开类向导给控件添加变量: 给IDC_PORT绑定变量,用于存放输入的端口号,数据类型为int,变量名为m_port 给IDC_RECEIVE绑定变量,用于存放接收到的数据,数据类型为CString,变量名为m_strReceive 给IDC_SEND绑定变量,用于存放输入的待发送的数据,数据类型为CString,变量名为m_strSend 4.给控件添加事件响应函数 右键单击Microsoft Communications Control控件,选择“添加事件处理程序”,点击“添加编辑”,生成响应函数,此函数用于接收数据。 在函数中添加以下代码: UpdateData(TRUE);if(nEvent == 2){ } UpdateData(FALSE);//将m_strReceive的值显示到控件中 //更新m_strReceive的值 //获取事件值 //获取缓冲区位数 //时间值为2,此时为收到数据 int nEvent = m_com.get_CommEvent();int k = m_com.get_InBufferCount();if(k <= 0)//位数小于等于0时则返回 return;char* str =(char*)m_com.get_Input().parray->pvData;//获取接收到数据的字*(str + k)= ' ';//字符数组最后一位的下一位设置为' ',为字符串的结尾标志 m_strReceive +=(const char *)str;//在用于显示的字符串末尾添加刚接收到的符数组的首地址 字符串 双击IDC_BTN_OPEN控件,即“打开”按钮,生成响应函数,此函数用于设置串口参数并打开串口。 在函数中添加以下代码: UpdateData(TRUE); if(m_port <= 0){ } m_com.put__CommPort(m_port);//设定串口为m_port的值 m_com.put_Settings(“9600,n,8,1”); //设定波特率9600,无奇偶校验位,8作为数据位,AfxMessageBox(“请输入正确的串口号!”);return; //更新m_port的值 //端口号不小于等于0 1作为停止位 m_com.put_InputMode(1);//设定数据接收模式,1为二进制方式 m_com.put_InputLen(0);//设置从接收缓冲区读取的字节数,0表示全部读取 m_com.put_InBufferSize(1024);//设置输入缓冲区大小为1024byte m_com.put_OutBufferSize(1024);//设置输出缓冲区大小为1024byte m_com.put_RThreshold(1);//每接收到一个字符时,触发OnComm事件 m_com.put_SThreshold(0);//每发送一个字符时,不触发OnComm事件 m_com.put_PortOpen(true); //打开串口 GetDlgItem(IDC_BTN_OPEN)->EnableWindow(FALSE);//打开按钮设为不可用 GetDlgItem(IDC_BTN_CLOSE)->EnableWindow(TRUE);//关闭按钮设为可用 GetDlgItem(IDC_BTN_SEND)->EnableWindow(TRUE); //发送按钮设为可用 双击IDC_BTN_CLOSE控件,即“关闭”按钮,生成响应函数,该函数用于关闭串口。在函数中添加以下代码: m_com.put_PortOpen(false);//关闭串口 GetDlgItem(IDC_BTN_OPEN)->EnableWindow(TRUE); //打开按钮设为可用 GetDlgItem(IDC_BTN_CLOSE)->EnableWindow(FALSE);//关闭按钮设为不可用 GetDlgItem(IDC_BTN_SEND)->EnableWindow(FALSE);//发送按钮设为不可用 双击IDC_BTN_SEND控件,即“发送”按钮,生成响应函数,该函数用于发送数据。在函数中添加以下代码: UpdateData(TRUE);//更新m_strSend的值,读取编辑框内容 m_com.put_Output(COleVariant(m_strSend));//发送数据 5.在对话框初始化函数中添加额外初始化代码 在对话框刚打开时,此时串口没有开启,故“关闭”按钮与“发送”按钮需设为不可用。在OnInitDialog函数中添加以下代码: GetDlgItem(IDC_BTN_CLOSE)->EnableWindow(FALSE);//关闭按钮设为不可用 GetDlgItem(IDC_BTN_SEND)->EnableWindow(FALSE);//发送按钮设为不可用 五、实验结果 对话框1 运行结果如下: 对话框2 运行结果如下: 六、实验心得 通过课上的学习,我学习到了数据通信的基础知识,对网络的分层结构以及相关协议有了进一步的认识。 通过本次实验,我对串口通信的原理有了更深的认识与理解,并对MFC界面制作更加熟练。总之,在本课程中我收获很多,不仅在通信方面的知识有所提升,同时也锻炼了编程能力,VC++软件的使用更加熟练。 一、实验报告为纸质报告,手写,不少于8页纸。 二、报告首页为标准实验报告封面,有课程名称、实验名称、姓名、时间 三、报告内容为:1、2、3、4、实验目的 实验题目 实验过程步骤,详细说明实验编程的过程 实验程序的主要代码和注释说明(不需要完整的程 序!)。 5、6、实验中遇到的问题,怎么解决的。实验心得 四、报告的得分主要根据3、4、5五、三份实验报告装订在一起 六、班长将报告收齐,按照班级序号排好,交给实验老师。第二篇:网络编程实验报告
第三篇:串口通信实验报告范文
第四篇:串口通讯实验报告
第五篇:《网络高级编程》实验报告要求