- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个简单的程序可以设置串行 (RS232) 端口的波特率。我正在使用 cfsetospeed()
和 cfsetispeed()
函数独立设置输入和输出速率。根据 man page ,如果我使用这些函数和适当的常量,这应该是可能的:
cfsetispeed() 将存储在 termios 结构中的输入波特率设置为速度,它必须指定为上面为 cfsetospeed() 列出的 Bnnn 常量之一。如果输入波特率设置为零,输入波特率将等于输出波特率。
cfsetospeed() 将存储在 termios_p 指向的 termios 结构中的输出波特率设置为速度,它必须是以下常量之一:
...
B600
...
B19200
我的问题是无论我设置第二个(输入还是输出)似乎都是两者的最终值。我正在尝试设置两个独立的速度。
代码:
int main() {
int fd, ret;
char buf[100] = {0};
char buf2[100] = {0};
struct termios options;
// Open the serial-USB device driver
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd < 0){
perror("open_port: Unable to open port - ");
return 1;
}
tcgetattr(fd, &options); //Get the current settings
cfsetospeed(&options, B9600); //Set input speed as 9600 Baud Rate
cfsetispeed(&options, B19200); //Set output speed as 19200 Baud Rate
ret= tcsetattr(fd, TCSANOW, &options); //Get the return to make sure it worked
sleep(3); // Just for kicks, let it "settle"
tcgetattr(fd, &options); //Read back the values
getBRate(buf, cfgetispeed(&options));
getBRate(buf2, cfgetospeed(&options));
printf("return code was: %d, ispeed %s, ospeed %s\n", ret, buf, buf2);
//Clean up
memset(buf, '0', 100);
memset(buf2, '0', 100);
close(fd);
return 0;
}
我的 getBRate()
函数只是一个简单的(丑陋的)开关,用于返回波特率的字符串版本:
void getBRate(char rate[], speed_t brate)
{
switch(brate) {
case B0: strcpy(rate,"none"); break;
case B50: strcpy(rate,"50 Baud");break;
case B110: strcpy(rate,"110 Baud");break;
case B134: strcpy(rate,"134 Baud");break;
case B150: strcpy(rate,"150 Baud");break;
case B200: strcpy(rate,"200 Baud");break;
case B300: strcpy(rate,"300 Baud");break;
case B600: strcpy(rate,"600 Baud");break;
case B1200: strcpy(rate,"1200 Baud");break;
case B1800: strcpy(rate,"1800 Baud");break;
case B2400: strcpy(rate,"2400 Baud");break;
case B4800: strcpy(rate,"4800 Baud");break;
case B9600: strcpy(rate,"9600 Baud");break;
case B19200: strcpy(rate,"19200 Baud");break;
default: strcpy(rate, "No valid baud found\n");break;
}
return;
}
这里的输出将是:
return code was: 0, ispeed 19200 Baud, ospeed 19200 Baud
如果我像这样反转两个“设置”行:
cfsetispeed(&options, B19200); //Set output speed as 19200 Baud Rate
cfsetospeed(&options, B9600); //Set input speed as 9600 Baud Rate
我的输出将变为:
return code was: 0, ispeed 9600 Baud, ospeed 9600 Baud
有什么想法吗?
编辑:
由于问题出现,此代码将在使用 Coldfire 528X(5280 或 5282)的板上运行。无论如何,根据 UART 的引用手册,RX 和 TX 应该能够有不同的速率:
23.3.4 UART 时钟选择寄存器 (UCSRn)
UCSR 选择 DTIN 输入上的外部时钟(除以 1 或 16)或预分频的内部总线时钟作为发送器和接收器的时钟源。请参见第 23.4.1 节“发送器/接收器时钟源”。发送器和接收器可以使用不同的时钟源。
最佳答案
现在我将接受@TJD 的回答作为事实 在我处理过的所有芯片中,串行端口硬件实际上只有一个波特率发生器,因此无法处理不同的 Tx 和Rx 波特率。
至于我没有看到任何错误这一事实,那是因为 tcsetattr()
的至少一个请求操作确实成功了 this page状态:
如果 tcsetattr() 函数能够执行任何请求的操作,即使无法执行某些请求的操作,它也会成功返回。
所以现在,我猜硬件没有能力支持这个,但我从 set 函数中成功返回,因为它设置了我请求的两个东西之一。
关于c - 为什么输入和输出波特率总是一样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12920108/
在 setup() 中,我有 Serial.begin(9600),但是当我让串行监视器打印任何内容时,没有显示任何文本。我曾尝试移动 print() 函数的位置(包括直接在 Serial.begin
我正在使用以下代码片段每秒通过 com 端口发送一次 gps 数据: serialPort = new SerialPort("COM4", 4800, Parity.None, 8, StopBit
我们有一个电机 Controller ,它实现了USB->虚拟COM端口,其波特率固定为921600(手册甚至指出波特率无法更改)。我发现如果我使用像 Terminal 这样的终端程序,我可以通过自定
我一直在寻找 Beaglebone Black (BB) 支持的 UART 波特率。我在 BB 系统引用手册或 sitara 处理器本身的数据表中找不到它。我正在使用 pyserial 和 Adafr
我正在尝试编写一个使用 IrDA 与 Uwatec 潜水电脑通信的工具……在 Mac 上。我正在使用的 USB IrDA 设备提供了一个串行设备(/dev/cu.IrDA-IrCOMM0 和 /dev
我是一名优秀的程序员,十分优秀!