|
还是串口通信的问题:
我想获取往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;
} |
|