我现在正在做一个项目来监听主站和从站之间的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,反之亦然。它就像中间人一样。请注意,不需要中间人,因为主设备可以直接连接到从设备,但我想将数据用于其他目的。感谢。