Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 串行端口二进制传输更改回车_C_Linux_Serial Port_Carriage Return_Linefeed - Fatal编程技术网

C 串行端口二进制传输更改回车

C 串行端口二进制传输更改回车,c,linux,serial-port,carriage-return,linefeed,C,Linux,Serial Port,Carriage Return,Linefeed,在过去的一周里,我一直在尝试用C语言实现一个原始的串行文件传输协议,我遇到了一个非常奇怪的问题,我似乎找不到在线解决方案。我设法通过串行端口传输二进制数据并接收它,但在此过程中,所有“0D”字节都转换为“0A”。下面是我的代码 #include <stdlib.h> #include <stdio.h> /* Standard input/output definitions */ #include <string.h> /* String functi

在过去的一周里,我一直在尝试用C语言实现一个原始的串行文件传输协议,我遇到了一个非常奇怪的问题,我似乎找不到在线解决方案。我设法通过串行端口传输二进制数据并接收它,但在此过程中,所有“0D”字节都转换为“0A”。下面是我的代码

#include <stdlib.h>
#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <errno.h>   /* Error number definitions */
#include <signal.h>
#include <sys/ioctl.h>
#include <termios.h>

//eventually plan to set up a proper communication protocol
#define ACK 0x01 
#define NAK 0x00

int setAttribs (int fd, int speed, int parity);
unsigned char* readFile(char* filename, int* file_size);

int main(void){

    //set up ports
    int fd = 0, r = 0, i = 0;
    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);//sending port
    if(fd<0){
            perror("open port ttyUSB0 failed");
            return -1;
    }
    setAttribs(fd,1500000,0);

    int rd =0, file_size=0, bytes=0;
    rd = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NDELAY);//receiving port
    setAttribs(rd,1500000,0);

    //create file to which the binary data will be written
    FILE *newFile;
    newFile = fopen("t.bin","wb");
    if(newFile<0){
            printf("open file failed\n");
            return -1;
    }

    //This character array will hold the file to be transferred
    unsigned char* data = '\0';
    data = readFile("t.odt", &file_size);

    ioctl(rd, TCFLSH, &bytes);//port flush which does not seem to work      
    do{

            //write data in 1024 byte chunks
            write(fd,data+i,1024);

            //wait for write to finish
            usleep(8500);

            //buffer to hold received bytes
            unsigned char buffer[1024];

            //ensure buffer is empty
            memset(buffer,0,1024);

            //read in 1024 byte chunks
            read(rd, buffer, 1024);

            //printing bytes in the buffer to check for errors
            for(r=0;r<1024;r++){
                    if(r%16==0)
                            printf("\n");
                    printf("%02X ", buffer[r]);
            }

            //write to file in 1024 byte chunks
            fwrite(buffer, 1,1024,newFile);

            //increase counter
            i+=1024;

    }while(i<8197);//its an 8088 byte file  
    printf("Done!\n");
    return 0;
}

unsigned char* readFile(char* filename, int* file_size){

    unsigned char *buffer = NULL;
    int string_size, i;
    FILE *handler = fopen(filename, "rb");

    if (handler)
    {
            // Seek the last byte of the file
            fseek(handler, 0, SEEK_END);
            // Offset from the first to the last byte, or in other words, filesize
            string_size = ftell(handler);
            printf("File length: %d\n",string_size);
            *file_size = string_size;
            // go back to the start of the file
            rewind(handler);

            // Allocate a string that can hold it all
            buffer = (unsigned char*) malloc(sizeof(unsigned char) * (string_size + 1) );

            // Read it all in one operation
            for(i=0;i<string_size;i++){
                    fread(buffer+i, sizeof(unsigned char),1, handler);
                    if(i%16==0)
                            printf("\n");
                    printf("%02X ",*(buffer+i));
            }
            // fread doesn't set it so put a \0 in the last position
            // and buffer is now officially a string
            //      buffer[string_size] = '\0';
            printf("Finished read\n");

            // Always remember to close the file
            fclose(handler);
    }
 return buffer;
}
int setAttribs (int fd, int speed, int parity)
{
    struct termios tty;
    memset (&tty, 0, sizeof tty);
    if (tcgetattr (fd, &tty) != 0)
    {
            fputs("error %d from tcgetattr", stderr);

    }
    cfsetospeed (&tty, speed);
    cfsetispeed (&tty, speed);

    tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;     // 8-bit chars
    // disable IGNBRK for mismatched speed tests; otherwise receive break
    // as \000 chars
    tty.c_iflag &= ~IGNBRK;         // disable break processing
    tty.c_lflag = 0;                // no signaling chars, no echo,
    // no canonical processing
    tty.c_oflag = 0;                // no remapping, no delays
    tty.c_cc[VMIN]  = 0;            // read doesn't block
    tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout

    tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl

    tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
    // enable reading
    tty.c_cflag &= ~(PARENB | PARODD);      // shut off parity
    tty.c_cflag |= parity;
    tty.c_cflag &= ~CSTOPB;
    tty.c_cflag &= ~CRTSCTS;

    if (tcsetattr (fd, TCSANOW, &tty) != 0)
    {
            fputs("error %d from tcsetattr", stderr);

    }
    return 1;
}
                                                                                                                                                                                                                                         
#包括
#包括/*标准输入/输出定义*/
#include/*字符串函数定义*/
#include/*UNIX标准函数定义*/
#包含/*文件控制定义*/
#包括/*错误号定义*/
#包括
#包括
#包括
//最终计划建立一个合适的通信协议
#定义ACK 0x01
#定义NAK 0x00
int setAttribs(int fd、int速度、int奇偶校验);
未签名字符*读取文件(字符*文件名,整数*文件大小);
内部主(空){
//设置端口
intfd=0,r=0,i=0;
fd=open(“/dev/ttyUSB0”,O|RDWR | O|nocty | O|NDELAY);//发送端口

如果(fd非常感谢你,它工作得很好!!我从来都不知道有ICRNL选项可以将换行符转换为回车符。一旦我用

tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); //tty is the name of the struct termios

它是金色的。

您是如何确定这段代码写出了什么数据的?您是否100%确定错误不在另一边?(此外,您忽略了
read
write
的返回值,这使得您更难知道代码实际在做什么。)我认为您必须使用row模式,并且使用tcsetattr应清除INLCR。有关更多详细信息,请阅读手册第3页TCSETATTRelated: