|
还是串口通信的问题:
我想获取往gtk_entry里输入的内容并将其放进一个数组里buf_send里,然后通过串口传到另一台电脑的串口调试助手里将其显示,编译以后别的输出一切正常,另一台电脑也能收到我写进entry里的内容,可是程序里的语句
perror("write");输出确是write:非法seek操作.
这到底是哪里除了问题呢,大家能否给我指点一下!
以下是我的callbacks.c文件里的程序代码,entry在文件face.c里定义的:
[code:1]
#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[i]=*get;
buf_send[i]='\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[i])
{
cfsetispeed(&ttynew,speed_arr[i]);
cfsetospeed(&ttynew,speed_arr[i]);
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;
}
[/code:1]
|
|