1

请参考以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <termios.h>

#define BAUDRATE    B115200
#define SER_DEVICE  "/dev/ttyS0"
#define FALSE       0
#define TRUE        1


int main()
{
int fd,c,res,i,n;
struct termios oldtio,newtio;
unsigned char buf[255] = "WELCOME TO THE WORLD OF LINUX PROGRAMMING\n";
unsigned char buf2[255]= {"\0"};
//Opening a Device for Reading Writing.
//O_NOCTTY : - The Port Never Becomes the Controlling Terminal of the Process.
//O_NDELAY : - Use NON-Blocking IO. on some system this also means Deactivating the DCD line.

fd=open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY);

if(fd<0)
{
printf("\nError in opening the File\n");
exit(0);
}
else
{
printf("File Opened  SuccessFull..HurraYYY !!!!1\n");
}

//printf("--------------Test Begin---------------\n");

//Save Current Serial Port Settings

tcgetattr(fd,&oldtio);
//clear the struct for New port settings
memset(&newtio,0,sizeof(newtio));

//Baud rate : Set bps rate .
//You could also use cfsetispeed and cfsetospeed.
//CRTSCTS : Output Hardware Flow control
//CS8 : 8n1(8bit No Parity 1 Stopbit)
//CLOCAL : local connection no modem control
//CREAD : Enable Receiving character
//printf("Setting Configuration for Port");
newtio.c_cflag |= (BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD);

//IGNPAR : Ignore bytes with parity error.
//ICRNL : map CR to NL 
//printf("Setting Parity\n");
newtio.c_cflag |= (IGNPAR | ICRNL);

//RAW output
//printf("Raw Output\n");
newtio.c_oflag = 0;
//printf("Enabling Canonical format \n");
//ICANON : Enable canonical input.
newtio.c_lflag |= ICANON;
//printf("Initialising Char\n");
//Initialise all characters
newtio.c_cc[VMIN] = 1;   /*Blocking read until one character arrives*/
newtio.c_cc[VTIME] = 0;  /*Inter character timer unused*/

/*
Now clean the Modem Line and Activate the Settings for the Port.
*/
tcflush(fd,TCIFLUSH);
printf("Flushing Lines\n");
tcsetattr(fd,TCSANOW,&newtio);


n=write(fd,&buf,42);
printf("n=%d",n);


for(i=0;i<sizeof(unsigned int);i++);

for(i=0;i<sizeof(unsigned int);i++);
for(i=0;i<sizeof(unsigned int);i++);
for(i=0;i<200;i++)
printf("");
n=0;
n = read(fd,&buf2,42);
if(n==-1)
{
printf("\nError in Receiving");
}
else
printf("Received String = %s",buf2);

/*
Restore the Old Port Setting
*/

tcsetattr(fd,TCSANOW,&oldtio);

printf("==============TEST END==============\n");

close(fd);
}

我能够传输出现在超级终端上的字符串。但函数读取返回值为 -1。我发现的可能性是:1.接收配置错误。2. 是否需要环回。

我尝试循环返回,但它不起作用。我在 while(1) 中执行了代码

发送和接收...如果读取返回一些东西!= -1 ..从循环中中断。但这不起作用。在读/写周期中应该添加的最小延迟是多少。

我在 MPC 8641d 处理器上执行此代码。

请您的建议对我很重要。

希望得到您的指导!!!!:)

4

2 回答 2

2

要了解 read() 失败的详细原因,您需要查看全局变量 errno 中存储的值(这在读取的手册页中有说明)。一个简单的方法是在打印失败消息时使用perror()而不是 printf() ——perror() 将附加一个人类可读的字符串来告诉你原因。

于 2012-04-21T12:13:50.223 回答
1

在此之前阅读 John Zwinck 的答案;)

有关 errno 的背景信息:http ://www.gnu.org/software/libc/manual/html_node/Checking-for-Errors.html

要详细说明特定 errno WRT 的意义,请阅读:并非所有“错误”都意味着“您做错了什么”或“无法读取此连接”。它们可能只是意味着此时无法读取此连接,例如,如果 errno 在非阻塞连接上为 EAGAIN。

这意味着您必须弄清楚错误是什么,如果是这种错误,如何处理它。然后你必须专门针对 errno 进行测试,例如:

#include <errno.h>

int bytes = read(...);
if (bytes == -1) {
// example of an error which may happen under normal conditions
// for certain kinds of file descriptors:
    if (errno == EAGAIN) {
        // handle appropriately
    } else {
        // this is a real error which should not happen
    }
}

您可以通过打印 errno 的 int 值并查看 errno.h 来找到常量。很有可能,它们实际上位于 errno.h 包含的文件中,例如 /usr/include/asm-generic/errno.h 和 errno-base.h。我系统上前者的随机示例:

#define ECOMM 70 /* Communication error on send */

所以 perror() 或 strerror() 会(可能)报告“发送时的通信错误”,但无论如何,它的 int 值是 70。 不要在代码中使用它,它们可能因实现而异;#include <errno.h>并使用常数ECOMM

于 2012-04-21T12:38:49.857 回答