串口自发自收

tracyjk 2011-01-17 09:31:43
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>

int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
if ( tcgetattr( fd,&oldtio) != 0) {
perror("SetupSerial 1");
return -1;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;

//数据位
switch( nBits )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}

//奇偶校验
switch( nEvent )
{
case 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E':
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N':
newtio.c_cflag &= ~PARENB;
break;
}

//设置波特率
switch( nSpeed )
{
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}

//停止位
if( nStop == 1 )
newtio.c_cflag &= ~CSTOPB;
else if ( nStop == 2 )
newtio.c_cflag |= CSTOPB;

//时间
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;

//清空缓存
tcflush(fd,TCIFLUSH);

//配置立即生效
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("com set error");
return -1;
}
printf("set done!\n");
return 0;
}

int open_port(int fd,int comport)
{
if (comport==1)
{ fd = open( "/dev/ttySAC0", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
return(-1);
}
else
printf("open ttySAC0 .....\n");
}
else if(comport==2)
{ fd = open( "/dev/ttySAC1", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
return(-1);
}
else
printf("open ttySAC1 .....\n");
}
else if (comport==3)
{
fd = open( "/dev/ttySAC2", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
return(-1);
}
else
printf("open ttySAC2 .....\n");
}
if(fcntl(fd, F_SETFL, 0)<0)
printf("fcntl failed!\n");
else
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
if(isatty(STDIN_FILENO)==0)
printf("standard input is not a terminal device\n");
else
printf("isatty success!\n");
printf("fd-open=%d\n",fd);
return fd;
}

int main(void)
{
int fd;
int nread,i;
char buff[]="1234567890123\n",buf[100];

//打开串口2
if((fd=open_port(fd,3))<0){
perror("open_port error");
return;
}
//串口配置
if((i=set_opt(fd,115200,8,'N',1))<0){
perror("set_opt error");
return;
}
printf("fd=%d\n",fd);
#if 1
while(1){


nread=write(fd,buff,14);
printf("write=%d\n",nread);
sleep(1);
#if 1
nread=0;
memset(buf,0x00,100);
nread=read(fd,buf,14);
printf("read=%d [%s]===",nread,buf);
for(i=0;i<14;i++)
printf("%c",buf[i]);
printf("\n");
sleep(3);
#endif
}
#endif
close(fd);
return;
}


用串口2接红外设备自发自收,执行以上的程序在终端上显示的信息如下
write=14
read=1 []===
write=14
read=1 []===
write=14
read=1 []===
write=14
read=1 []===
write=14
read=1 []===
write=14
read=1 []===


用示波器测试发送和接受都有波形出来,确认硬件可以正常工作

想请教各位大牛我这样写自发自收的程序有问题么,怎么read返回的只有1呢
...全文
276 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tracyjk 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jnwsh 的回复:]
自收自发接线怎样呢?485是差分信号。你怎么实现自受自发呢?
[/Quote]
硬件设计我没原理图,怎么接线的不知道
只是看了手册要用 RS-485 标准串行电气接口。


实现自发自收就是对设备写入再读出来,不知道你问的怎么实现自收自发是什么意思?
jnwsh 2011-01-17
  • 打赏
  • 举报
回复
自收自发接线怎样呢?485是差分信号。你怎么实现自受自发呢?
tracyjk 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 copyman39339005 的回复:]
红外是半双工还是全双工?全双工怎么自发自收啊?
还有红外模块的处理速度应该是不快的,具体要用多少的速率要看你的设备,我没用过,但是115200似乎太快了
[/Quote]
把波特率改低了后接收到的字符个数达到了14
只不过接收到的东西和发送的不一样,能否请大牛再指点下
tracyjk 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 copyman39339005 的回复:]
红外是半双工还是全双工?全双工怎么自发自收啊?
还有红外模块的处理速度应该是不快的,具体要用多少的速率要看你的设备,我没用过,但是115200似乎太快了
[/Quote]
485,是半双工的。
我把波特率改低点试试
copyman39339005 2011-01-17
  • 打赏
  • 举报
回复
红外是半双工还是全双工?全双工怎么自发自收啊?
还有红外模块的处理速度应该是不快的,具体要用多少的速率要看你的设备,我没用过,但是115200似乎太快了
tracyjk 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 codesnail 的回复:]
楼主,估计没人愿意去看程序的。
[/Quote]

只想请教下我这样自发自收有问题么
 while(1){


nread=write(fd,buff,14);
printf("write=%d\n",nread);
sleep(1);
#if 1
nread=0;
memset(buf,0x00,100);
nread=read(fd,buf,14);
printf("read=%d [%s]===",nread,buf);
for(i=0;i<14;i++)
printf("%c",buf[i]);
printf("\n");
sleep(3);
#endif
}
codesnail 2011-01-17
  • 打赏
  • 举报
回复
楼主,估计没人愿意去看程序的。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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