200分送了!!!急,小弟急求各位大侠
具体的是这样,主程序是一个死循环(在计算数据),这个时候,需要响应串口传过来的数据进行计算
1。需中断响应,这个程序怎么写?
2。我用了termios这个结构,很奇怪的是,可以接收(用信号,听说这个类似DOS的INT),但是不能够发送,不知道哪里出错了,向串口发送数据是(write(fd,buff,100))这个函数吗?有其他的函数吗?我在DOS下面用的outportb这个,直接对地址发送(outportb(0x3f8,buff,1))Linux下面的outb这个函数是否一样?
3,因为在中断里面需要判断当前串口是发送还是接收,需要直接读取UART寄存器的值,我在DOS下面用如下代码『
adr1 = 0x3f8
cb=inportb(adr1+2);
if(cb==6)
{
inportb(adr1+5);
continue;
}
if(cb==4)//这个时候中断接收数据
{
readserial()
continue;
}
if(cb==2)//这个时候中断发送数据
{
writeserial();
continue;
}
} while((cb & 1)==0); //2
outportb(0x20,0x20);
』
上面这段程序在linux下面如何实现?用outb这个函数可以直接读取吗?关键问题就是如何判断串口寄存器的状态
下面这个是我写的Linux下面的第一个程序,请大家看看,错在哪里呀?只能够接收,不能够发送!!!
程序:
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <asm/io.h>
#include <errno.h>
#include <sys/mman.h>
#include <signal.h>
#include <fcntl.h>
#include <termios.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
void readserial();
void writeserial();
void signal_handler_IO (int status);
main() {
int fd,c, res;
struct termios oldtio,newtio;
struct sigaction saio;
char buf[255];
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
saio.sa_handler = signal_handler_IO;
saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
fcntl(fd, F_SETOWN, getpid());
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,&oldtio);
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0; //这个发送我不知道怎么设置,老是发送不对
newtio.c_lflag = ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
while (1) {
// 计算
需要串口实时传送过来的数据,必须中断发送和接收
}
tcsetattr(fd,TCSANOW,&oldtio);
}
void readserial();
{
read(fd,readbuf,1) //
/* 这个readbuf的值需要返回mian的while中进行计算
}//read 程序已经调通
void writeserial()
{
write(fd,writebuf,1)
//这个writebuf是while计算以后的值,发送出去
}//不知道这错在哪里?????老实发送不了??
void signal_handler_IO (int status)
{
/*
这里就需要刚才上面那个程序说的如何判断 UART寄存器的状态值了
if(串口有数据传入)
readserial();
if(有数据输出)
writeserial();
}//这个问题现在是一点都没有搞明白
小弟,在次谢过完整看了问题的各位大哥,如果你能帮忙,请回帖,如果不能,大家一起交流!
问题点数:20、回复次数:16Top
1 楼batfree(没有计算机的程序员)回复于 2004-12-01 20:45:23 得分 0
帮你顶,Top
2 楼h_bin16888(木之杉)回复于 2004-12-01 21:01:29 得分 0
谢谢,自己在顶一下Top
3 楼hellopower(飞鸟)回复于 2004-12-06 10:25:25 得分 0
200分?Top
4 楼h_bin16888(木之杉)回复于 2004-12-19 02:26:13 得分 0
没有人知道吗?Top
5 楼blder(波拉登)回复于 2004-12-19 08:30:33 得分 0
知也不说
太没道德Top
6 楼h_bin16888(木之杉)回复于 2004-12-19 15:06:18 得分 0
楼上这位兄弟,怎么了?Top
7 楼romantickiller(RK)回复于 2004-12-19 21:16:04 得分 0
看了半天,觉得少了一个0 ,好象Top
8 楼NC(比尔.盖饭)回复于 2004-12-19 21:43:44 得分 0
你可以在死循环中用select函数监控串口Top
9 楼h_bin16888(木之杉)回复于 2005-02-17 13:21:14 得分 0
如果分不够,我可以在加,好像是我错少打了一个0!
用死循环是不行的,因为还有其他很多事情要做,时间来不急!能有那种类似DOS下面的直接读串口地址的方法??mmap可以,读内存映射。我想知道一个命令,可以看见所以硬件的地址?Top
10 楼h_bin16888(木之杉)回复于 2005-02-19 19:31:28 得分 0
upTop
11 楼core(猪母狼马)回复于 2005-02-20 10:39:41 得分 20
有必要那么复杂吗?我是READ,WRITE,就这么个死循环
如果就这么点动作,SELECT都不用了
WRITE不了,不会看看返回值吗?
我的初始化过程
int fd, rc;
struct termios tio;
if ((fd = open(file, O_RDWR | O_NOCTTY | O_NDELAY)) < 0)
{
perror(file);
return -1;
}
tio.c_cflag = B19200 | CRTSCTS | CS8 | CLOCAL | CREAD;
tio.c_iflag = IGNPAR;
tio.c_oflag = 0;
tio.c_lflag = 0;
tio.c_cc[VTIME] = 1;
tio.c_cc[VMIN] = 0;
tcsetattr(fd, TCSANOW, &tio);
Top
12 楼h_bin16888(木之杉)回复于 2005-02-20 19:55:40 得分 0
楼上的兄弟,你的意思???我需要很强的实时性。5ms内的时间是很多事情的Top
13 楼h_bin16888(木之杉)回复于 2005-02-23 18:56:06 得分 0
顶Top
14 楼h_bin16888(木之杉)回复于 2005-02-26 11:08:12 得分 0
大家有做过实时嵌入式的吗???做过就会知道我的意思了Top
15 楼getit911(Windows转Linux中)回复于 2005-02-26 17:55:45 得分 0
开2个线程,一个读,一个写Top
16 楼gdhyj(gdhyj)回复于 2005-02-26 18:13:18 得分 0
另外开一个线程,不断地读串口,读到数据后就发数据给主线程,主线程的循环里加个判断,如果发现有数据过来就先处理过来的数据,没有的话就接着死循环计算Top




