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);
}

ハイパーターミナルに表示される文字列を送信できました。ただし、関数 Read は値を -1 として返します。私が見つけた可能性は次のとおりです。1.構成の受信が間違っています。2. ループバックが必要かどうか。

Looping Back を試しましたが、うまくいきません。while(1) でコードを実行しました

transmit ans Receive ... そして read が何かを返したら != -1 ..ループから抜け出します。しかし、それはうまくいきません。読み取り/書き込みサイクルに追加する必要がある最小遅延は何ですか。

このコードを MPC 8641d プロセッサで実行しています。

あなたの提案は私にとって重要です。

あなたの導きを願っています!!!! :)

4

2 に答える 2

2

read() が失敗した詳細な理由を知るには、グローバル変数 errno に格納されている値を確認する必要があります (これは read のマニュアル ページに記載されています)。これを行う簡単な方法はperror()、失敗メッセージを出力するときに printf() の代わりに使用することです.perror() は、理由を示す人間が読める文字列を追加します.

于 2012-04-21T12:13:50.223 に答える
1

この前にジョン・ズウィンクの答えを読んでください;)

errno に関する背景情報: http://www.gnu.org/software/libc/manual/html_node/Checking-for-Errors.html

特定の errno WRT read の重要性について詳しく説明すると、すべての「エラー」が「何か間違ったことをした」または「この接続を読み取れない」という意味ではありません。これらは単に、この接続が現時点で読み取れないことを意味する場合があります。たとえば、非ブロッキング接続で 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 に答える