单片机串口接收发送函数
2016-01-03 11:12
411 查看
/*********************************************************************************** * 标题: RS232串口通信试验 * * 功能:串口接收数据后打印,按回车键处理命令,通过数组储存命令 * * 按 退格键 会准确地删除一位数据并清除串口的显示,尝试使用串口命令来清屏 * *************************************************************************************/ #include <REG52.H> sbit BEEP = P1^4; sbit JDQ1 = P1^1; sbit JDQ2 = P1^2; bit Flag; bit Flag_comm; unsigned char ReData[5],SenData[5]; //接收数据缓存,发送数据缓存 ,不指定大小会waring,应该是怕溢出 unsigned char serial_receive[64]; //接收命令的数组 static unsigned char coun = 0; void serial_print(char *str){ unsigned char i = 0; while(str[i] != '\0') { SBUF = str[i]; while(!TI); TI = 0; i++; } } //串口初始化,初始化函数需要改进,修改为自动计算配置 void serial_init(){ SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD|= 0x20; //定时器工作方式2 PCON|= 0x80; TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592) // TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M) TL1 = 0xF3; TR1 = 1; } //主函数,串口接收完整指令后解析执行命令 void main (void) { serial_init(); //串口初始化要加入配置 ES = 1; //开串口中断 EA = 1; // 开总中断 serial_print("\n\rserial_init,waiting for input:\n\r"); serial_print("common input:"); while(1) { if(Flag_comm == 1){ serial_print("\n\r"); serial_print("receive common:"); serial_print(serial_receive); serial_print("\n\r"); //这里将传入参数进行命令解析 //solve(serial_receive); serial_print("excuseing !!!!!!!!!!!!\n\r"); serial_print("common input:"); coun = 0; //打印后清零串口计数 Flag_comm = 0; //处理命令后清除标志位 } } } /**************************************************** 串口中断程序 ******************************************************/ void serial_interrupt (void) interrupt 4 using 1 { if(RI == 1) //RI接受中断标志 { RI = 0; //清除RI接受中断标志 Flag=1; //接收到数据 *ReData = SBUF; //SUBF接受/发送缓冲器 *SenData = *ReData; if( *ReData != 0x0d ){ //等待接收回车 if( *ReData == 0x08 ){ //退格键 serial_receive[--coun] = '\0';//遇到退格键要把刚刚的值清0,所以是--coun serial_print("\b "); //覆盖掉原来的值 }else{ serial_receive[coun++] = *ReData; } }else{ serial_receive[coun] = '\0'; //遇到回车键,写\0,字符串终止 Flag_comm = 1; //接收命令完成,解析命令 } } if(Flag == 1){ //接收到字符就打印,避免存在输入过快无法显示 serial_print(SenData); Flag = 0; } } //0x0d = \r 0x0a = \n 0x08 = \b
相关文章推荐
- Linux串口通信
- PHP通过串口实现发送短信
- python简单程序读取串口信息的方法
- Python操作串口的方法
- python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
- 51单片机的中断整理
- linux串口编程(termios)相关的使用问题
- QT 串口的监控
- linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解
- 电脑串口及并口连接线大全
- RS232C串口通信接线方法(三线制)
- [Unity3D]Unity3D使用串口的设置
- STM32串口操作相关事项
- 串口与并口的区别
- Linux串口编程
- 将LINUX的控制台定向到串口终端
- v虚拟机Linux(Fedora10)下USB转串口的使用, minicom: cannot open /dev/ttyUSB0的解决
- linux下开发串口遇到的问题记录
- wince中的串口编程
- CVI 串口搜索代码