问题
I'm having a problem reading from a serial device on Linux. The problem is rather weird, and I wasn't able to nail down the causes.
I'm opening the /dev/ttyUSB0 file with PHP and beginning to communicate with the device according to the device's protocol. Many times I encountered a situation where the PHP script waits for the device to respond. When I ran a Perl script in parallel which supposed to do the same it sent a request to the same device, and quit supposedly without getting a response. Then I saw that the PHP script got the response (only after the Perl script sent a request).
I encountered a similar matter when trying to read Arduino with PHP. The PHP got no response from the port, but Arduino IDE's Serial Monitor printed it.
I think I'm missing a crucial thing about Linux files and USB ports here. What might be the problem? How can I tell which programs use the port/file?
$usb = 'ttyUSB0';
`stty -F /dev/$usb 9600`;
`stty -F /dev/$usb -parity`;
`stty -F /dev/$usb cs8`;
`stty -F /dev/$usb -cstopb`;
$f = fopen("/dev/$usb", "r+");
if(!$f) {
echo "error opening file\n";
exit;
}
statusRequest($f);
sleep(1);
$c = readPort($f);
echo "$c\n";
function statusRequest($port) {
$data = "request";
fwrite($port, $data);
fflush($port);
}
function readPort($port) {
$read = 1;
$c = '';
while($read > 0) {
$bytesr = unpack("h*", fread($port, 1));
$c .= $bytesr[1];
//echo $bytesr[1];
if($bytesr[1] == 'ff') {
$read = 0;
}
}
return $c;
}
回答1:
Check these two articles on my wiki. The first article describes how to set useful permissions on the device node. The second article is an example that prints out all data that the remote sends to the PC. Although written for Arduino it is easily ported for other uses.
- http://wirespeed.xs4all.nl/mediawiki/index.php/Udev_rules_file_for_Arduino_boards
- http://wirespeed.xs4all.nl/mediawiki/index.php/Cat_ttyUSB0
Using lsof you can find out which program is currently using the port:
lsof | grep /dev/ttyUSB0
cat_ttyUS 19182 jhendrix 3u CHR 188,0 0t0 14519955 /dev/ttyUSB0
With the stty commands you don't lock the port for exclusive use.
来源:https://stackoverflow.com/questions/5014451/reading-and-writing-to-from-serial-device-via-usb-on-linux-with-perl-or-php