- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在通过@wallyk 在how to open, read, and write from serial port in C 中的回答后,我写了一个程序通过我的USB端口发送数据。我需要发送一个 6 字节的数据,其中第一个字节应该是标记奇偶校验,其余字节应该是空间奇偶校验。这就是我声明 2 个变量 msg1 和 msg2 的原因
#include<stdio.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include<fcntl.h>// used for opening ttys0
#include<sys/ioctl.h>
#include<sched.h>
#include<string.h> // for memset
#include<time.h>
int set_interface_attribs (int fd, int speed, int parity)
{
struct termios tty;
memset (&tty, 0, sizeof tty); // initialize all in struct tty with 0
if (tcgetattr (fd, &tty) != 0)// gets parameters from fd and stores them in tty struct
{
perror("error from tcgetattr");
return -1;
}
cfsetospeed (&tty, speed);
cfsetispeed (&tty, speed);
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars, CSIZE -> character size mask
// disable IGNBRK for mismatched speed tests; otherwise receive break
// as \000 chars
tty.c_iflag &= ~IGNBRK; // ignore break signal
tty.c_lflag = 0; // no signaling chars, no echo,
// no canonical processing
tty.c_oflag = 0; // no remapping, no delays
tty.c_cflag &= ~(PARENB | PARODD); // shut off parity
tty.c_cflag |= parity;
tty.c_cflag &= ~CSTOPB;// 1 stop bit
tty.c_cflag &= ~CRTSCTS;
if (tcsetattr (fd, TCSANOW, &tty) != 0) // TCSANOW -> the change takes place immediately
{
perror("error from tcsetattr");
return -1;
}
return 0;
}
int main()
{
char *portname = "/dev/ttyUSB0";
int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0)
{
perror("error opening");
return;
}
char msg1[1]={0x01};
char msg2[5]={0x02,0x08,0x00,0xff,0xf5};
set_interface_attribs (fd, B115200,PARENB|PARODD|CMSPAR); // set speed to 115200, bps,mark parity
// set no blocking
write (fd, msg1, sizeof msg1);
set_interface_attribs (fd, B115200,PARENB|CMSPAR); // set speed to 115200 bps, space parity
write (fd,msg2,sizeof msg2);
close(fd);
return 0;
}
但是现在我发送的所有数据似乎都是空间奇偶校验而不是标记奇偶校验。即,如果我已将第一个字节配置为以标记奇偶校验发送,其余字节以空间奇偶校验发送,则所有字节均以空间奇偶校验发送。现在,如果我将第一个字节配置为以空间奇偶校验发送,其余字节以标记奇偶校验发送,那么所有字节都将以标记奇偶校验发送。
最佳答案
我有一个类似的问题,试图发送带有奇偶校验“标记”的第一个字节以及所有带有奇偶校验“空间”的其余字节,而我拥有的 USB 到串行驱动程序忽略了“标记/空格”选项,我注意到使用协议(protocol)分析器,它使用的是“奇数/偶数”。所以我最终创建了一个查找表,其中包含在发送每个字节之前需要使用的奇偶校验(奇/偶),以模拟“Mark/Space”奇偶校验,并且我会在发送每个字节之前相应地更改奇偶校验。显然这会在每次奇偶校验交换时引入许多毫秒的延迟,因此由于这意味着仅适用于以单一波特率运行的单一用途嵌入式设备,因此修改了 USB 到串行驱动程序以删除一些检查它正在执行(如波特率变化)并使奇偶校验切换速度提高一倍。如果驱动程序用于一般用途,我不建议更改它,但如果您能够承受每次奇偶校验更改之前引入的字符间延迟,那么这可能会有所帮助。
查找表是这样的:
static const char parity[256]= {
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0
};
要发送带有奇偶校验“标记”的第一个字节,我使用的是:
if (parity[buff[0]]==1)
SetParity (fd,EVEN_PARITY);
else
SetParity (fd,ODD_PARITY);
这是“SetParity()”函数
int SetParity(int fd, int parity) {
struct termios options,options1;
string strToLog;
bzero (&options, sizeof (options));
bzero (&options1, sizeof (options1));
if (tcgetattr (fd, &options) ==-1) {
usleep (500);
int aa=tcgetattr (fd, &options);
ostringstream osString (" ");
osString<<std::dec<<fd<<"FD error! Get A";
if (aa==-1)
osString<<std::dec<<fd<< "FD error! Get B";
strToLog.append (osString.str());
Log(LOG_ALERT,strToLog.c_str());
if (aa==-1)
return -1;
}
options.c_cflag |= (CLOCAL | CREAD);
switch (parity) {
case NO_PARITY:
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
break;
case ODD_PARITY:
options.c_cflag|=PARODD;
options.c_cflag|=PARENB;
options.c_cflag&=~CMSPAR;
break;
case EVEN_PARITY:
options.c_cflag&=~PARODD;
options.c_cflag|=PARENB;
options.c_cflag&=~CMSPAR;
break;
case MARK_PARITY:
options.c_cflag|=PARODD;
options.c_cflag|=PARENB;
options.c_cflag|=CMSPAR;
break;
case SPACE_PARITY:
options.c_cflag&=~PARODD;
options.c_cflag|=PARENB;
options.c_cflag|=CMSPAR;
break;
default:
return (-1);
}
if (-1 == tcsetattr (fd, TCSADRAIN, & (options))) {
printf ("ERROR--------------------------------setParity\n");
ostringstream osString (" ");
osString<<std::dec<<fd<<"FD error! Set A";
usleep (500);
int aa= tcsetattr (fd, TCSADRAIN, & (options));
if (aa==-1)
osString<<std::dec<<fd<<" FD error! Set B";
strToLog.append (osString.str());
printf(strToLog.c_str());
if (aa==-1)
return -1;
}
return 1;
}
关于c - 带标记和空间奇偶校验的串行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23466349/
http://opencv-code.com/quick-tips/implementation-of-guo-hall-thinning-algorithm/ 在看郭霍尔算法,但我不明白它说的那部分
我知道这个方法检查整数是否为偶数,但是具体如何检查呢?我理解斐波那契或阶乘等例子的递归是如何工作的,但不理解这个。我认为由于语法原因我不明白。 // Assume n >= 0 public stat
我被困在一个作业上,需要程序接受多个数字,然后如果是奇数则输出"is",如果是偶数则输出“否”,并且不知道如何让程序接受超过 1 个 int,然后输出正确的 println。这是我到目前为止的代码。
这个测试行得通吗?: if (testInt/2).ofType(Integer){ //to-do if even } 我假设它会 iff 编译器在 ofType() 之前解析 testIn
我正在尝试更好地排列图像,而不仅仅是 1 列中的图像。示例见附件,每篇文章的图片可以在左右。 这是我的代码。HTML: Content 1
DAY16共3题: 奇♂妙拆分(简单数学) 区区区间间间(单调栈) 小AA的数列(位运算dp) 🎈 作者:Eriktse 🎈 简介:19
我是一名优秀的程序员,十分优秀!