gpt4 book ai didi

c - 在 Ubuntu 下从串口读取和写入 USB 秤

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:45 26 4
gpt4 key购买 nike

我有一个通过 USB 连接到我的 Ubuntu 笔记本电脑的数字秤,我想从中读取测量值。串行协议(protocol)非常简单(9600,8N1,ttyUSB0),我能够通过使用终端的 putty (VT100+) 正确读取测量值。

秤需要接收指令

"READ<CR><LF>"

为了发送测量值。每个测量值都有这种格式:

01ST,GS,   2.5,kg<CR><LF>

例如,如果我测量的是 2.5 公斤的负载。

现在,我正尝试从 C 应用程序发送 READ 命令,但无法得到任何答复。

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>

int set_interface_attribs(int fd, int speed)
{
struct termios tty;

if (tcgetattr(fd, &tty) < 0) {
printf("Error from tcgetattr: %s\n", strerror(errno));
return -1;
}

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

tty.c_cflag |= (CLOCAL | CREAD); /* ignore modem controls */
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8; /* 8-bit characters */
tty.c_cflag &= ~PARENB; /* no parity bit */
tty.c_cflag &= ~CSTOPB; /* only need 1 stop bit */
tty.c_cflag &= ~CRTSCTS; /* no hardware flowcontrol */

/* setup for non-canonical mode */
tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
tty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
tty.c_oflag &= ~OPOST;

/* fetch bytes as they become available */
tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 1;

if (tcsetattr(fd, TCSANOW, &tty) != 0) {
printf("Error from tcsetattr: %s\n", strerror(errno));
return -1;
}
return 0;
}

void set_mincount(int fd, int mcount)
{
struct termios tty;

if (tcgetattr(fd, &tty) < 0) {
printf("Error tcgetattr: %s\n", strerror(errno));
return;
}

tty.c_cc[VMIN] = mcount ? 1 : 0;
tty.c_cc[VTIME] = 5; /* half second timer */

if (tcsetattr(fd, TCSANOW, &tty) < 0)
printf("Error tcsetattr: %s\n", strerror(errno));
}


int main()
{
char *portname = "/dev/ttyUSB0";
int fd;
int wlen;
printf("Opening the connection on serial port\n");
fd = open(portname, O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0) {
printf("Error opening %s: %s\n", portname, strerror(errno));
return -1;
}
/*baudrate 9600, 8 bits, no parity, 1 stop bit */
set_interface_attribs(fd, B9600);
//set_mincount(fd, 0); /* set to pure timed read */

/* simple output */
printf("Sending the command READ\n");
wlen = write(fd, "READ\n", 5);
if (wlen != 5) {
printf("Error from write: %d, %d\n", wlen, errno);
}
tcdrain(fd); /* delay for output */


/* simple noncanonical input */
do {
unsigned char buf[80];
int rdlen;

rdlen = read(fd, buf, sizeof(buf) - 1);
if (rdlen > 0) {

buf[rdlen] = 0;
printf("Read %d: \"%s\"\n", rdlen, buf);

} else if (rdlen < 0) {
printf("Error from read: %d: %s\n", rdlen, strerror(errno));
} else { /* rdlen == 0 */
printf("Timeout from read\n");
}
/* repeat read to get full message */
} while (1);
}

你能帮帮我吗?谢谢你!我是初学者,所以这可能只是我看不到的愚蠢错误。

但是,有没有其他更快的方法来获取相同的任务?

最佳答案

可能命令应该以回车结束(不是你写的换行符):

    wlen = write(fd, "READ\n", 5);

改为

    wlen = write(fd, "READ\r", 5);

如果它真的(它可能,但也许不是)必须接收 crlf:

    wlen = write(fd, "READ\r\n", 6);

关于c - 在 Ubuntu 下从串口读取和写入 USB 秤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57859690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com