所以我正在编写一个串行传输程序,并且刚刚转换为使用C++,因为我使用C++已经有一段时间了(我最近一直在使用C,之前是java)
现在我需要使用LibSerial,(它似乎比C的termios更简单)
我的代码是:
//gen1.cpp
#include "string2num.h" // a custom header
#include <iostream>
#include <SerialStream.h>
using namespace LibSerial;
//using namespace std;
int main(int argc, char*argv[])
{
if (argc<2)
{
std::cout<<argv[0]<<"requires the device name eg \"dev/tty0\" as a parameter\nterminating.\n";
return 1;
}
SerialStream theSerialStream(argv[1]); //open the device
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译输出时:
g++ -Wall -o gen1 gen1.cpp string2num.o
/tmp/cchPBWgx.o: In function `main':
gen1.cpp:(.text+0x121): undefined reference to `LibSerial::SerialStream::SerialStream(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::_Ios_Openmode)'
/tmp/cchPBWgx.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[vtable for LibSerial::SerialStreamBuf]+0x24): undefined reference to `LibSerial::SerialStreamBuf::showmanyc()'
/tmp/cchPBWgx.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[vtable for LibSerial::SerialStreamBuf]+0x28): undefined reference …Run Code Online (Sandbox Code Playgroud) 我想解释一个命令字符串,由微控制器收到(PIC16f877A,如果这有什么不同)通过串口.
字符串有一个非常简单和直接的格式:$ AABBCCDDEE(2个字符的5个"块"+总共11个字符的'$')其中:$ AA =命令的实际名称(可以是字母,数字,两者;强制性的); BB-EE =参数(数字;可选);
我想用C/C++编写代码.
我想我可以通过串口抓取字符串,将其破解为块,切换(){case}和memcmp命令块($ AA).然后我可以使用二进制决策树来使用BB CC DD和EE块.
我想知道这是否是正确的做法(这对我来说有点难看,肯定必须有一个不那么乏味的方法来做到这一点!).
我正在尝试编写一个使用串行端口的C++ MFC应用程序(例如COM8).每次我尝试设置DCB时都会失败.如果有人可以指出我做错了什么,我真的很感激.
DCB dcb = {0};
dcb.DCBlength = sizeof(DCB);
port.Insert( 0, L"\\\\.\\" );
m_hComm = CreateFile(
port, // Virtual COM port
GENERIC_READ | GENERIC_WRITE, // Access: Read and write
0, // Share: No sharing
NULL, // Security: None
OPEN_EXISTING, // The COM port already exists.
FILE_FLAG_OVERLAPPED, // Asynchronous I/O.
NULL // No template file for COM port.
);
if ( m_hComm == INVALID_HANDLE_VALUE )
{
TRACE(_T("Unable to open COM port."));
ThrowException();
}
if ( !::GetCommState( m_hComm, &dcb ) )
{ …Run Code Online (Sandbox Code Playgroud) 这里http://www.python.org/doc/essays/graphs/是DFS吗?
我尝试用'兄弟姐妹'做点什么,但它不起作用.任何人都可以写BFS类似于该网站的代码.
我正在尝试在二叉树中编写广度优先搜索的代码.我已将所有数据存储在队列中,但我无法弄清楚如何前往所有节点并消耗所有孩子.
这是我在C中的代码:
void breadthFirstSearch (btree *bt, queue **q) {
if (bt != NULL) {
//store the data to queue if there is
if (bt->left != NULL) enqueue (q, bt->left->data);
if (bt->right != NULL) enqueue (q, bt->right->data);
//recursive
if (bt->left != NULL) breadthFirstSearch (bt->left, q);
if (bt->right != NULL) breadthFirstSearch (bt->right, q);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经将根数据排入队列,但它仍然无效.谁能指出我的错误?
我需要(设计?)用于通过串行连接在微处理器驱动的数据记录器和PC(或类似)之间进行通信的协议.没有控制线,设备/ PC可以知道它们连接的唯一方式是它们接收的数据.连接可能随时被破坏并重新建立.串行连接是全双工的.(8N1)
问题是要使用什么类型的数据包,握手代码或类似的.微处理器的能力非常有限,因此协议需要尽可能简单.但是数据记录器将具有许多功能,例如调度记录,下载日志,设置采样率等,这些功能可能同时处于活动状态.
我的臃肿版本将是这样的:对于数据记录器和PC,固定的数据包大小为16字节,带有简单的1字节校验和,可能是开头/结尾的0x00字节,以简化数据包的识别,一个字节表示数据包中的数据类型(命令/设置/日志数据/实时馈送值等).为了进行同步,可以由PC发送唯一的"hello/reset"数据包(例如所有零),然后返回设备检测到该数据包以确认同步.
我对这种方法的任何评论表示感谢,并欢迎任何其他建议以及一般性意见.
观察:我认为我必须自己动手,因为我需要尽可能轻量化.我将从答案中提出的协议以及我发现的其他一些内容中获取点点滴滴...... Slip, PPP和HLDC.
我有以下框架:
7e 01 00 00 01 00 18 ef 00 00 00 b5 20 c1 05 10 02 71 2e 1a c2 05 10 01 71 00 6e 87 02 00 01 42 71 2e 1a 01 96 27 be 27 54 17 3d b9 93 ac 7e
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,那么就是计算FCS的帧的这一部分:
010000010018ef000000b520c1051002712e1ac205100171006e8702000142712e1a019627be2754173db9
Run Code Online (Sandbox Code Playgroud)
我已经尝试将其输入到许多在线计算器中,但我无法从上述数据中生成0x93ac.
http://www.lammertbies.nl/comm/info/crc-calculation.html输入类型为十六进制.
0x93ac是如何到达的?
谢谢,
巴里
基本的算术运算线程安全吗?
例如,如果++对全局变量进行操作(将从不同的线程修改),是否需要锁定它?
例如
void MyThread() // can have many running instances
{
aGlobal++;
}
Run Code Online (Sandbox Code Playgroud)
或应该是
void MyThread()
{
lock( lockerObj)
{
aGlobal++;
}
}
Run Code Online (Sandbox Code Playgroud) 我将通过内置硬件串行库在两个 Arduino 之间建立二进制驱动的串行通信。由于我的数据包采用二进制格式构建,因此对于值为 0 的整数实例,数据包中的几个字符很可能是空字符。我不确定 Arduino 将如何处理空字符,或者是否有处理。在我进一步开展我的项目之前,我当然想知道。