win XP 上用VM 装linux,串口通信问题。

HNLGDXYJS 2010-11-09 03:23:24
hi,大家好。
我在win xp上用vm装了fedora(linux) 系统,现在需要测串口通信,要在虚拟机上跑串口通信程序。
在同一台虚拟机中能完成测试不?环境如上所述。我已按网上方法设置可达到如下目的:
(1)打开一个终端,执行 cat /dev/ttyS0
(2)打开另一个终端,执行 echo hi everyone > /dev/ttyS1
在第一个终端(即 cat /dev/ttyS0) 能看到 hi everyone,说明两个串口之间通信了。

请问这种情况下,达到了我想用C程序测试串口通信所要的条件了吗?谢谢。。

我写了两个程序,一个send.c 用来发送,一个recv.c,用来接收串口信息,但互相不鸟对方,请教各位老大,我的系统环境有问题不?或我的代码有问题不?
以下是我的代码:

// send.c ..........................................
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>


#define TTYS0 /dev/ttyS0
#define TTYS1 /dev/ttyS1


#define MAX_BUF_SIZE 1024*20 // define maxinum buffer length

int open_serial_port(int device)
{
int serial_port;
if (0 == device)
{
if (serial_port = open("dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY) < 0)
{
perror("open /dev/ttyS0 encouter an error\n");
exit(1);
}
printf("open /dev/ttyS0 success.serial_port is %d..\n",serial_port);
}
else
{
if (serial_port = open("/dev/ttyS1",O_RDWR | O_NOCTTY | O_NDELAY) < 0 )
{
perror("open /dev/ttyS1 encouter an error\n");
exit(1);
}
printf("open /dev/ttyS1 success.serial_port is %d..\n",serial_port);
}
return serial_port;
}






int main(int argc,char *argv[])
{
char *msg = "hi,everyone...";
int sendlen = strlen(msg);
int serial_port = open_serial_port(1); // open /dev/ttyS0
struct termios opt;
tcgetattr(serial_port,&opt);
cfmakeraw(&opt);// sets the structure specified by opt to raw mode.
// there is no effect on the hardware until a subsequent successful call to tcsetattr()...
cfsetispeed(&opt,B38400); // set input baud as 38400 bps
cfsetospeed(&opt,B38400);
opt.c_cc[VMIN] = 1;
opt.c_cc[VTIME] = 1;
tcsetattr(serial_port,TCSANOW,&opt); //change attr as soon as possible
while (1)
{
int ret_val = write(serial_port,msg,sendlen);
assert(ret_val != -1);
printf("write %d bytes to serial_port %d successfully...\n",ret_val,serial_port);
sleep(3);
}
if (close(serial_port) == -1)
{
printf("close serial_port error\n");
(1);
}
printf("leave...\n");
return 0;
}




//recv.c .........................................................
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>

#define TTYS0 /dev/ttyS0
#define TTYS1 /dev/ttyS1

#define MAX_BUF_SIZE 1024*20 // define maxinum buffer length

int open_serial_port(int device)
{
int serial_port;
if (0 == device)
{
if (serial_port = open("dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY) < 0)
{
perror("open /dev/ttyS0 encouter an error\n");
exit(1);
}
printf("open /dev/ttyS0 success,serial_port is %d...\n",serial_port);
}
else
{
if (serial_port = open("/dev/ttyS1",O_RDWR | O_NDELAY | O_NOCTTY) < 0 ) // O_NOCTTY
{
perror("open /dev/ttyS1 encouter an error\n");
exit(1);
}
printf("open /dev/ttyS1 success,serial_port is %d...\n",serial_port);
}
return serial_port;
}






int main(int argc,char *argv[])
{
char recvbuf[MAX_BUF_SIZE];
int serial_port = open_serial_port(1); // open /dev/ttyS0
struct termios opt;
tcgetattr(serial_port,&opt);
cfmakeraw(&opt);// sets the structure specified by opt to raw mode.
// there is no effect on the hardware until a subsequent successful call to tcsetattr()...
cfsetispeed(&opt,B38400); // set input baud as 38400 bps
cfsetospeed(&opt,B38400);
opt.c_cc[VMIN] = 1;
opt.c_cc[VTIME] = 1;
tcsetattr(serial_port,TCSANOW,&opt); //change attr as soon as possible
while (1)
{
int ret_val = read(serial_port,recvbuf,MAX_BUF_SIZE);
assert(ret_val != -1);
printf("read %d bytes from serial_port %d successfully...\n",ret_val,serial_port);
printf("recv msg is %s...\n",recvbuf);
sleep(3);
}
if (close(serial_port) == -1)
{
printf("close serial_port error\n");
exit(1);
}
printf("leave...\n");
return 0;
}



代码本身很简单,请各位给点耐心,稍看一下,感激不尽,谢谢。。


...全文
453 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nottobe123 2011-12-20
  • 打赏
  • 举报
回复
占个沙发,俺也在做这方面 的东西
谭海燕 2010-11-11
  • 打赏
  • 举报
回复
乱码是因为接受的buffer没有清空。

没有清空,使得解析失败
HNLGDXYJS 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hnlgdxyjs 的回复:]

引用 7 楼 feiyinzilgd 的回复:

只要通信的双方波特率一样就OK。

阻塞方式:
1。要么设定等待接收到一定数量的字符就返回,要么一直等待。有数据就读取。

hi,thanks...
现在可以通信了,但有一个问题:
当发送一方不断的发送,接收一方不断的接收,接收端会乱序,请问正常否?
应该是不正常了,有什么解决方法不?
thanks
[/Quote]
HNLGDXYJS 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 feiyinzilgd 的回复:]

你用C实现串口通信,主要就是串口参数设置问题。

参数合适了,就对了。

你的代码我没怎么看。
主要就是几方面:
1.波特率,
2. 串口阻塞方式
[/Quote]

谢谢,请问一下:
1、波特率是否随便一个值都行? 9600、38400、115200。。不用特定的机子特定的波特率吧?
2、串口阻塞方式是指要阻塞式进行串口读写吗?
谢谢。
HNLGDXYJS 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 feiyinzilgd 的回复:]

只要通信的双方波特率一样就OK。

阻塞方式:
1。要么设定等待接收到一定数量的字符就返回,要么一直等待。有数据就读取。
[/Quote]
hi,thanks...
现在可以通信了,但有一个问题:
当发送一方不断的发送,接收一方不断的接收,接收端会乱序,请问正常否?
应该是不正常了,有什么解决方法不?
thanks
谭海燕 2010-11-10
  • 打赏
  • 举报
回复
只要通信的双方波特率一样就OK。

阻塞方式:
1。要么设定等待接收到一定数量的字符就返回,要么一直等待。有数据就读取。
HNLGDXYJS 2010-11-10
  • 打赏
  • 举报
回复
顶,问题还是没解决,有经验的能帮我看一下代码不?也就main()里四五行代码,看我的初始化有没有问题?谢谢啦。。
谭海燕 2010-11-09
  • 打赏
  • 举报
回复
谭海燕 2010-11-09
  • 打赏
  • 举报
回复
你用C实现串口通信,主要就是串口参数设置问题。

参数合适了,就对了。

你的代码我没怎么看。
主要就是几方面:
1.波特率,
2. 串口阻塞方式
HNLGDXYJS 2010-11-09
  • 打赏
  • 举报
回复
我感觉这两端互不理睬,程序表现也是这样。。
其实send.c的工作就是写 /dev/ttyS1 ,相当于 echo hi everyone > /dev/ttyS1
而recv.c 就是读,相当于 cat /dev/ttyS1

就是这样。但现在 send 跟 recv 连不上,应该不是环境的问题,因为 echo ...接着 cat ...能看到数据,说明串口是互通的,问题就可能出在代码里了,但我也不确定,希望大家能帮我看一下代码,谢谢。。
yangzhifu 2010-11-09
  • 打赏
  • 举报
回复
把你两端运行的打印信息拿来看下阿

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧