c串口编程作为中介

时间:2017-12-05 18:15:25

标签: c raspberry-pi modbus rs485

我现在正在做一个项目来监听主站和从站之间的PROFIBUS网络之间的数据。设置将是主服务器将连接到Raspberry Pi,并且Raspberry Pi将连接到从服务器。

到目前为止,我能够读取主设备发送的电报或消息并将其发送给从设备。但是,我无法得到奴隶的回应。当主设备直接连接到从设备时,通信正在工作。

这应该是一个非常简单的任务,因为基本上我应该编程的只是从master读取,将其写入slave并获得slave的响应。我想也许我错过了什么,你们可以帮帮我吗?这是代码......



    .... include all library definitions..


    // GLOBAL VARIABLES
    char portMaster[] = "/dev/ttyAMA0";
    char portSlave[] = "/dev/ttyUSB0";


    // SERIAL PORT FUNCTIONS
    // Open the port to start reading and writing
    int openPort(char port[]) 
    {
        int fd; 
        .... do all the settings for serial port communication.....
        return fd;      
    } // end of openPort function


    // PROFIBUS TELEGRAM FUNCTIONS
    /*
    - get incoming telegrams from master and directly write them to the slave
    */
    int getPacketsFromMaster(int fdMaster, int fdSlave, int debug)
    {
        static unsigned char uartBuffer[MAX_BUFFER]; 
        int bytesRead = 0;
        // Loop indefinitely to get data
        while(1)
        {
                bytesRead = read(fdMaster, &uartBuffer[0], 20); // read the ports
                // read until the telegram is complete, code not shown here
                break;
         }
         write(fdSlave, &uartBuffer[0], length);
         return 1;
    }


    // Get Packets from Slave and directly write to the master
    int getPacketsFromSlave(int fdSlave, int fdMaster, int debug)
    {
        static unsigned char uartBuffer[MAX_BUFFER]; 
        int bytesRead = 0;
        // Loop indefinitely to get data
        while(1)
        {
                bytesRead = read(fdSlave, &uartBuffer[0], 20); // read the ports
                // read until the telegram is complete, code not shown here   
                break;        
         }
         write(fdMaster, &uartBuffer[0], length);//length came from header
         return 1;
    }       


    int main(void)
    {
            // open ports
            int fdMaster = openPort(portMaster);
            int fdSlave = openPort(portSlave);
            if(fdSlave == -1 || fdMaster == -1)
            {
                printf("Operation halted!!!! Exiting Now");
                return 0;
            }

            int status;
        while(1)
        {
            status = getPacketsFromMaster(fdMaster, fdSlave, 1);
            if(status)
                getPacketsFromSlave(fdSlave, fdMaster, 1);
        }

        return 0;
    }

代码缩短了,因为大多数代码都非常基本,比如设置串口。如前所述,函数 getPacketsFromMaster 能够从主服务器中完美读取。函数 getPacketsFromSlave 具有超时,因为从属设备根本不需要响应主服务器发送的请求。

当我输出(写入)从站并听取响应时,问题就开始了。有时奴隶回答得很完美,很多时候都没有回复,有时电报也不是我所期待的。我应该使用像冲洗或排水?任何???

Raspberry Pi基本上只是中介,从master获取数据并将其发送到slave,反之亦然。它就像中间人一样。请注意,不需要中间人,因为主设备可以直接连接到从设备,但我想将数据用于其他目的。感谢。

0 个答案:

没有答案