小编ATa*_*lor的帖子

串行编程RS485

我的任务是通过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)

c c++ serial-communication rs485 baud-rate

10
推荐指数
1
解决办法
1万
查看次数

在Qt中递归遍历目录,跳过文件夹"." 和"......"

我在使用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也会返回'.' 和'..'目录.通过这种设置,这证明是一个主要问题.

通过进入'.',它将遍历整个目录两次,甚至是无限的(因为'.'始终是第一个元素),使用'..'它将重做父目录下所有文件夹的进程.

我想做的很好,很时尚,有什么办法可以解决这个问题,我不知道吗?或者是唯一的方法,我得到纯文件名(没有路径)并检查对'.' 和'..'?

c++ directory qt

8
推荐指数
1
解决办法
6610
查看次数

没有访问它就引用未初始化的内存是合法的吗?

下面的情况,我有一个结构包含指向整数变量的指针,如下所示:

struct Structure[] = { 
    { &Var[0], &Var[1] },
    { &Var[2], &Var[3] }
};
Run Code Online (Sandbox Code Playgroud)

事情是:Var第一次填充此结构时未初始化.(如NULL:)在(第一次通过)之后不久,变量Var将被初始化并且引用将相应地更新.

我认为这没有理由发生故障,但我希望你对它有所了解.将无效内存(带数组下标)的引用放入这样的数组中是否合法?或者我是否需要针对这种情况采用不同的方法?

我在第一次初始化之前才访问这些变量的内容.

非常感谢你.

编辑:为了未来读者的利益:Var是一个全局指针变量,在开始时初始化为NULL.初始化通过使用将其转换为数组new.

c++ memory variables

7
推荐指数
1
解决办法
544
查看次数

集类型的可变长度参数列表

好吧,我很确定以前已经以某种方式讨论过这个问题,但我发现它显然太愚蠢了.

第一:我不是在寻找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++,并寻找一种不同的方法解决我的问题.

再次,非常感谢你.

c c++ arguments function

5
推荐指数
1
解决办法
413
查看次数

访问unsigned char线程安全(原子)

我很清楚之前已经提出了类似的问题,而且我也知道,这个操作很可能根本就不是原子的,但是我仍然要求空闲的好奇心,并希望有一些方法可以让它成为原子.

情况:在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解决方案也可以.

非常感谢你.

c++ multithreading thread-safety

5
推荐指数
1
解决办法
1346
查看次数

长文本的快速 JS 分页

我正在尝试使用 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)

javascript jquery pagination

2
推荐指数
1
解决办法
2227
查看次数

C++选择函数过早中断

好的,首先关闭:对不起,如果之前已经询问过这个问题,但是我找不到正确的关键字.

情况:我有一个小型网络服务器,它运行在自己的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,都会不断打破.它不断报告套接字上的"活动". …

c++ sockets

1
推荐指数
1
解决办法
185
查看次数