在VM7.1下给虚拟机增加一个串口(使用物理串口),注意此时在虚拟机中是串口1。
linux端程序(接收):
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
#define BAUDRATE B9600
#define MODEMDEVICE "/dev/ttyS1"
int main()
{
int fd,c=0,res;
struct termios oldtio,newtio;
int ch;
static char s1[20],buf[19];
printf("start ...\n");
/*打开PC的COM1口*/
fd = open(MODEMDEVICE,O_RDWR|O_NOCTTY);
if (fd == -1 )
{
perror(MODEMDEVICE);
exit(1);
}
printf("open...\n");
/*将旧的通讯参数存入oldtio结构*/
tcgetattr(fd,&oldtio);
/*初始化新的newtio */
bzero((char*)&newtio,sizeof(newtio));
/*8N1*/
newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
/*正常模式*/
/*newtio.c_lflag = ICANON;*/
/*非正常模式*/
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 10;
tcflush(fd,TCIFLUSH);
/*新的temios作为通讯端口参数*/
tcsetattr(fd,TCSANOW,&newtio);
printf("writing...\n");
res = read(fd,buf,10);
printf("%s\n",buf);
printf("close...\n");
/*还原旧参数*/
tcsetattr(fd,TCSANOW,&oldtio);
close(fd);
return 0;
}
51端(使用kerl2)发送:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code trdata[]={'R','I','C','H','M','C','U','R','Z','-','5','1','V','2','.','0',0x0d,0x0a,0x00};
sbit K1=P3^2; //对应开发板K1按键
/*-------------------------------------------------------------*/
//串口初始化
void UART_Init(void)
{
SCON = 0x40; //串口工作方式为1
TMOD = 0x20; //定时器1 工作在方式2
//PCON = 0x80; //SMOD = 1; 波特率加倍
TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHz
TL1 = 0xfd;
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}
void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
;
}
}
/*-------------------------------------------------------------*/
//串口发送一个字符串
void Uart_SendString()
{
uchar i=0;
while(trdata!=0x00)
{
SBUF=trdata;
while(!TI);
TI=0;
i++;
}
}
/*-------------------------------------------------------------*/
//主函数
void main(void)
{
UART_Init(); //初始化串口
while(1)
{
if(K1==0)
{
delay1ms(20);
if(K1==0)
{
Uart_SendString(); //发送数据
while(!K1); //等待按键释放
}
}
}
}
linux发51接收的差不多,只是51端要多出一个中断处理程序。