我的任务是通过RS485 2线系统实现ModBus协议.(实际上它是三根线,A/B和GND).虽然ModBus不是重点,但是之前的步骤......界面上的简单I/O.
我正在使用FTDI USB-RS485转换器将Linux主机(不可互换)连接到Windows主机(可与其他Linux主机互换,但我想避免这种情况)
编码应该是19200,8,n,1.但它似乎不起作用.
我没有准确的代码,但在Linux上我这样做:
int fd = open("/dev/ttyS3", O_RDWR | O_CTTY);
if(fd == -1) return "Error while opening the port";
Run Code Online (Sandbox Code Playgroud)
接下来,我配置端口.
struct termios tty;
tcgetattr(fd, &tty);
cfsetispeed(&tty, B19200);
cfsetospeed(&tty, B19200);
tty.c_cflag = CS8; //Empties the cflags and sets the character width.
tty.c_cflag |= (CLOCAL | CREAD); //Sets 'recommended' options.
tty.c_lflag = 0;
tty.c_iflag = 0;
tty.c_oflag = 0;
tcgetattr(fd, TCSANOW, &tty);
Run Code Online (Sandbox Code Playgroud)
奇偶校验和流量控制目前尚未规划,因为最终结果将连接到低级别的电路板,我需要自己处理信号.此外,没有任何电线,这将允许"不受约束的通信".(毕竟我不希望XON/XOFF字符限制我可以传输的字节范围)
所有这些功能都能正常运行并设置数据.
在Windows上,我打开这样的串口:
DCB SP;
HANDLE hSerial = CreateFile("COM6", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); …Run Code Online (Sandbox Code Playgroud) 我在使用Qt函数递归遍历目录时遇到了一些麻烦.我正在做的事情:
打开指定的目录.遍历目录,每次遇到另一个目录时,打开该目录,浏览文件等.
现在,我如何做到这一点:
QString dir = QFileDialog::getExistingDirectory(this, "Select directory");
if(!dir.isNull()) {
ReadDir(dir);
}
void Mainwindow::ReadDir(QString path) {
QDir dir(path); //Opens the path
QFileInfoList files = dir.entryInfoList(); //Gets the file information
foreach(const QFileInfo &fi, files) { //Loops through the found files.
QString Path = fi.absoluteFilePath(); //Gets the absolute file path
if(fi.isDir()) ReadDir(Path); //Recursively goes through all the directories.
else {
//Do stuff with the found file.
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我面临的实际问题:自然,entryInfoList也会返回'.' 和'..'目录.通过这种设置,这证明是一个主要问题.
通过进入'.',它将遍历整个目录两次,甚至是无限的(因为'.'始终是第一个元素),使用'..'它将重做父目录下所有文件夹的进程.
我想做的很好,很时尚,有什么办法可以解决这个问题,我不知道吗?或者是唯一的方法,我得到纯文件名(没有路径)并检查对'.' 和'..'?
下面的情况,我有一个结构包含指向整数变量的指针,如下所示:
struct Structure[] = {
{ &Var[0], &Var[1] },
{ &Var[2], &Var[3] }
};
Run Code Online (Sandbox Code Playgroud)
事情是:Var第一次填充此结构时未初始化.(如NULL:)在(第一次通过)之后不久,变量Var将被初始化并且引用将相应地更新.
我认为这没有理由发生故障,但我希望你对它有所了解.将无效内存(带数组下标)的引用放入这样的数组中是否合法?或者我是否需要针对这种情况采用不同的方法?
我在第一次初始化之前才访问这些变量的内容.
非常感谢你.
编辑:为了未来读者的利益:Var是一个全局指针变量,在开始时初始化为NULL.初始化通过使用将其转换为数组new.
好吧,我很确定以前已经以某种方式讨论过这个问题,但我发现它显然太愚蠢了.
第一:我不是在寻找va_list和其他宏.我正在寻找的是主要功能参数.
默认原型,众所周知的是:
int main(int argc, char *argv[]);
Run Code Online (Sandbox Code Playgroud)
现在,我希望我的程序有类似的东西,但不知道究竟是怎么回事.
我们假设我们有这个功能:
void Function(int argc, unsigned short *args[]) {
for(int i = 0; i < argc; ++i) printf("%hu ", args[i]);
}
Run Code Online (Sandbox Code Playgroud)
我想要这样的函数调用:
Function(5, 1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)
那会有用吗?因为我不想要va_list的"混乱",我也不想创建:
void AnotherFunction() {
unsigned short Args[] = { 1, 2, 3, 4, 5 };
Function(5, Args);
}
Run Code Online (Sandbox Code Playgroud)
仅仅因为在这种情况下我只需要一个简单的指针.有人可以指点我正确的方向吗?非常感谢你.
编辑:谢谢大家的宝贵意见.我会满足于'现在不能使用标准的C/C++,并寻找一种不同的方法解决我的问题.
再次,非常感谢你.
我很清楚之前已经提出了类似的问题,而且我也知道,这个操作很可能根本就不是原子的,但是我仍然要求空闲的好奇心,并希望有一些方法可以让它成为原子.
情况:在a里面struct,有一个名为unsigned的char变量Busy.(虽然它可以移出那里并独立站立).
此变量Busy由两个并发线程修改,一个在调度时设置位,另一个在完成调度操作时清除它们.
现在,调度看起来像这样:
while(SEC.Busy&(1 << SEC.ReqID))
if(++SEC.ReqID == 5) SEC.ReqID = 0;
sQuery.cData[2] = SEC.ReqID;
Run Code Online (Sandbox Code Playgroud)
而清理bitmaks看起来像这样:
SEC.Busy &= ~(1 << sQuery->cData[2]);
Run Code Online (Sandbox Code Playgroud)
cData [2]基本上携带有关通过网络使用哪个插槽的信息,并通过另一个线程中的回调返回.
现在的问题是:我怎样才能确保SEC.Busy(在这种困境中唯一的变量)不会被两个线程同时试图改变它而不使用互斥锁,关键部分或任何东西而撕裂如果可能的话?
我也尝试将SEC.Busy的内容分配给一个局部变量,改变它然后再写回变量,但不幸的是这个操作似乎也不是原子的.
我目前正在使用Borland C++ Builder 6,尽管GCC解决方案也可以.
非常感谢你.
我正在尝试使用 JavaScript 创建一个分页系统。
基本情况:我有一个数据库,里面有相当长的文本(故事章节,5000字+)。我想在网站上显示这些章节……但不是一次显示整个文本,因为这几乎会降低可读性,但会在页面中显示。我在显示文本方面没有问题,但需要正确地设置页面。
我一直在环顾四周,遇到了一个 JQuery 代码,它完成了我想要它做的事情……但是这个方法有一个主要的警告。完成文本分页大约需要 10 秒钟,这等待时间太长了。
代码的基本作用是:将文本拆分为单词(以空格分隔)。然后它尝试将一个单词一个接一个地添加到 innerHTML,检查文本现在是否大于它应该容纳的容器。
每次打破边界时,它都会恢复到前一个字符串并创建一个新页面。(通过将文本封装到一个跨度中,然后可以在某个时刻隐藏/显示)这有效,但是它太慢了,因为它必须运行这些检查 5000+ 次。
我尝试创建一个近似系统,它基本上取单词量,将其除以因子 0.5,检查缓冲区是否大于所需大小,并重复此过程,直到缓冲区“小于”所需大小第一次,从那个位置开始,它填充缓冲区,直到它满了。
但是它似乎无法正常工作(双字,行,未完全填满,并且仍然太慢。)
这是我目前正在使用的代码,我将不胜感激任何修复和建议如何使它更容易,尤其是:更快。哦和:不,服务器端分页不是一种选择,因为它应该适合可变浏览器格式......在分辨率为 1280x768 的全屏浏览器中,与分辨率为 1024x768 的小型浏览器相比,页面数量会更少。
function CreateChild(contentBox, Len, pageText, words) {
var Child = document.createElement("span");
Child.innerHTML = pageText;
contentBox.appendChild(Child);
if(Len == 0) ++Len;
words.splice(0, Len);
return words.length;
}
$(document).ready(function(){
var src = document.getElementById('Source');
var contentBox = document.getElementById('content');
var inner = document.getElementById('inner');
//get the text as an array of word-like things
var words = src.innerHTML.replace(/ +/g, " ").split(' '), wCount = words.length;
//start off …Run Code Online (Sandbox Code Playgroud) 好的,首先关闭:对不起,如果之前已经询问过这个问题,但是我找不到正确的关键字.
情况:我有一个小型网络服务器,它运行在自己的Thread中.'Run'-Method迭代一组活动套接字(UDP和TCP),检查Activity并做它的事情.所有这些都是通过实现的select.
有可能,虽然添加了"卡在" select新服务器中.为此,我加入了一个"断路器插座",与其他插座一起检查.添加新套接字时会关闭它,因此还会监视新套接字的流量.(每次选择被破坏时fd_set都会重新生成)
代码是这样的(缩写):
fd_set fds;
SOCKET mSock = Breaker;
FD_ZERO(&fds);
//Aquire Mutex
if(Breaker == INVALID_SOCKET)
mSock = Breaker = socket(AF_INET, SOCK_STREAM, 0);
FD_SET(Breaker, &fds);
//Iterate over active sockets and add them to fds.
//Release Mutex
if(select(mSock + 1, &fds, NULL, NULL, NULL) > 0) {
//AquireMutex
//Iterate over active sockets, check for activity and act accordingly.
if(Breaker != INVALID_SOCKET && FD_ISSET(Breaker, &fds)
//Close Breaker and set it to INVALID_SOCKET
//Release Mutex
}
Run Code Online (Sandbox Code Playgroud)
现在实际问题select是:无论我是否关闭Breaker,都会不断打破.它不断报告套接字上的"活动". …