QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1116|回复: 0

串口通信(续三):"write:非法seek操作"

[复制链接]
发表于 2006-4-25 21:04:12 | 显示全部楼层 |阅读模式
还是串口通信的问题:
我想获取往gtk_entry里输入的内容以后,把这些内容放到一个缓冲区buf_send[]里,再通过串口输出到另一台电脑的串口调试助手里去显示出来.
编译之后别的输出一切正常,另一台电脑也能收到我写的数据,就是
perror("write");语句输出的内容是:write:非法seek操作.
不知大家能不能看出毛病到底在哪里,到底是怎么回事?


以下是我的关键程序代码:
#include<gtk/gtk.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<stdio.h>
#include<errno.h>

//声明entry1是个已定义的外部变量
extern *entry1;
//全局变量
char buf_send[1024];

//发送函数声明
//鉴于要检查串口是否通和其它参数情况,把串口通信函数设置成有返回值是有必要的
int datasend(char *dev,int speed);



void on_ok_button_clicked(GtkWidget *button,gpointer data)
{
int i;
char *get=gtk_entry_get_text(GTK_ENTRY(entry1));
for(i=0;*get!='\0';get++,i++)
buf_send=*get;
buf_send='\0';
//调用"串口发送数据"函数
datasend("/dev/ttyS0",38400);
}

int on_cancel_button_clicked(GtkWidget *button,gpointer data)
{
gtk_main_quit();
return FALSE;
}


int datasend(char *dev,int speed)
{
int fd,i,ret,write_return;
int speed_arr[]={B38400,B115200,B9600};
int name_arr[]={38400,115200,9600};
struct termios ttyold,ttynew;

fd=open(dev,O_RDWR|O_NOCTTY|O_NDELAY);
perror("/dev/ttyS0");
printf("fd=%d\n",fd);
if(!fd)
{
printf("cannot open %s\n",dev);
return -1;
}

ret=tcgetattr(fd,&ttyold);
if(ret<0)
{
printf("tcgetattr error!\n");
close(fd);
return -1;
}
bzero(&ttynew,sizeof(ttynew));

//设置波特率
for(i=0;i<sizeof(speed_arr)/sizeof(int);i++)
{
if(speed=name_arr)
{
   cfsetispeed(&ttynew,speed_arr);
   cfsetospeed(&ttynew,speed_arr);
   break;     //注意break的位置
}
}



//设置8位数据位
ttynew.c_cflag=(ttynew.c_cflag&~CSIZE)|CS8;
//设置1位停止位
ttynew.c_cflag&=~CSTOPB;
//无奇偶校验
ttynew.c_cflag&=~PARENB;
ttynew.c_iflag&=~INPCK;
ttynew.c_cflag|=(CLOCAL|CREAD);

//设置无硬件流控制
ttynew.c_cflag&=~CRTSCTS;
//设置无软件流控制
ttynew.c_iflag&=~(IXON|IXOFF|IXANY);
//设置为原始输出
ttynew.c_oflag&=~OPOST;


//设置串口属性
tcflush(fd,TCIOFLUSH);
fcntl(fd,F_SETFL,0);
ret=tcsetattr(fd,TCSANOW,&ttynew);
if(ret<0)
{
printf("error while setting %s attribe\n",dev);
close(fd);
return -1;
}

//发送数据,注意字符数组长度的"计算方法"
write_return=write(fd,buf_send,strlen(buf_send));
printf("write_return=%d\n",write_return);
perror("write");        //就是此语句输出的问题.
tcsetattr(fd,TCSANOW,&ttyold);   
close(fd);
return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 18:31 , Processed in 0.041796 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表