小编dso*_*ano的帖子

在线程中选择()系统调用?

我正在从多个串口读取数据.目前我正在使用自定义信号处理程序(通过设置sa_handler)来比较和唤醒基于文件描述符信息的线程.我正在寻找一种方法,让单个线程具有独特的信号处理程序,在这方面我发现将使用select系统调用.

现在我有以下问题:

  1. 如果我使用线程(Qt),那么我在哪里进行select系统调用来监控串口?
  2. select系统调用线程是否安全?
  3. 它是CPU密集型的,因为我的应用程序中发生了很多事情,包括GUI更新?

如果你觉得这些问题很荒谬,请不要介意.我从未使用过这种串行通信机制.

c++ unix serial-port

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

如何从仅8011的ONCE串行发送字符串?

我正在使8051微控制器与计算机进行无线通信.微控制器将字符串发送到其串行端口(DB9),计算机将接收该字符串并对其进行操作.

我的问题是我不知道如何让8051只传输一次字符串.由于我需要在PC端操作字符串,因此必须只接收一次.目前,即使在C代码中我发送一次字符串,在我的计算机上我连续收到相同的字符串.我认为这是因为SBUF中的任何内容都是连续传输的.有什么方法可以只发送一次我的字符串吗?有没有办法清空SBUF?

我试图在DB9上使用RTS(请求发送)引脚(第7个引脚),因为我读到某个地方,如果我否定了该引脚上的电压,它将阻止数据流到串行端口.所以我所做的是编程我的微控制器发送字符串,然后将逻辑电平0发送到连接到我的DB9 RTS引脚的输出引脚.但是,这没有用.

有没有人有什么建议?我真的很感激他们.

编辑

我在PC上使用的软件是Xbee模块的X-CTU.这是我的微控制器上的代码:

include reg51.h 
void SerTx(unsigned char);  
void main(void)  
{  
  TMOD = 0x20;  
  TH1 = 0xFD;  
  SCON = 0x50;  
  TR1 = 1;   

  SerTx('O');  
  SerTx('N');  
  SerTx('L');  
  SerTx('Y'); 

}

void SerTx(unsigned char x)  
{  
  SBUF = x;  
  while(TI==0);   
  TI = 0;   
}  
Run Code Online (Sandbox Code Playgroud)

有人可以验证它实际上只发送一次字符串吗?

编辑

看起来像史蒂夫,布鲁克斯和尼尔,当他们说这是我的主要功能导致问题之后发生的事情时,头部钉在头上.我刚刚尝试了Steve提出的建议代码(更具体地说是for(;;);并在main之外定义了serTX)并且它工作得很好.控制器可能重新启动,因此相同的代码不断重复.

非常感谢你的帮助!:)

c embedded microcontroller serial-port 8051

6
推荐指数
2
解决办法
8793
查看次数

如何在Delphi上生成唯一的计算机ID?

如何快速为delphi应用程序生成唯一的计算机ID?我以前用c#很容易做到这一点,但有时失败了.我确实希望ID是"静态的",但我不在乎是因为硬件更改或操作系统重新安装而导致id更改,我打算将其存储在注册表中并在应用启动时检查它,如果它已更改更新注册表.(我知道如何编写注册表部分,我只需要帮助唯一的ID).

谢谢.

delphi unique serial-number identification

6
推荐指数
2
解决办法
2万
查看次数

SQL n对n匹配多个值

我有一个将图像与标签匹配的Web应用程序,我需要创建一种动态优化标签搜索结果的方法.但是,我找不到一个干净的方法来进行SQL查询,这就是我需要你帮助的地方.

我的想法是,如果我搜索标签"干净"和"狗",我将得到图像结果,标签"干净"和"狗".如果我还包含标签"little",我的结果将必须缩小到与三个标签相关联的图像.

那么,有一个N对N的关系,这是正确的方法吗?

我的自然方法是生成这样的代码,但我当然不喜欢它的发展方向:

SELECT images.*
FROM images
INNER JOIN image_tags ON ...
INNER JOIN tags ON ...
WHERE tags.tag = @tag1
AND EXISTS
(
  SELECT 1
  FROM images 
  INNER JOIN image_tags ON ...
  INNER JOIN tags ON ...
  WHERE tag = @tag2
  AND EXISTS
  (
    SELECT 1
    FROM images 
    INNER JOIN image_tags ON ...
    INNER JOIN tags ON ...
    WHERE tag = @tag3
    AND EXISTS (...)
    ...
  )
)
Run Code Online (Sandbox Code Playgroud)

当然,那不是很好.任何的想法?

谢谢!

sql

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

使用PHP进行串行生成

在我作为PHP程序员和C#编程初学者的日子里,我一直想知道生成独特序列号的最佳方法,例如Microsoft Office和Microsoft操作系统的工作方式.

有没有人有一个很好的指导如何处理这个,比如生成唯一序列的重要因素,防止重复等.如何创建/验证它们的小例子.

这是我正在谈论的RFC:http://tools.ietf.org/html/rfc1982.

php license-key

6
推荐指数
3
解决办法
2万
查看次数

懒散,广度优先遍历玫瑰树?

我正在尝试重构一个当前产生Seq[X]使用相当昂贵的递归算法的组件,以便它产生一个Stream[X]代替,因此X可以按需加载/计算,并且生产者不必事先猜测如何为了满足消费者需要做很多事情.

从我所读到的,这是一个"展开"的理想用途,所以这是我一直试图采取的路线.

这是我的unfold功能,源于David Pollak的例子,该例子已由某位莫里斯先生审查过:

def unfold[T,R](init: T)(f: T => Option[(R,T)]): Stream[R] = f(init) match {
  case None => Stream[R]()
  case Some((r,v)) => r #:: unfold(v)(f)
}
Run Code Online (Sandbox Code Playgroud)

这是一棵小树,试试我的运气:

case class Node[A](data: A, children: List[Node[A]]) {
  override def toString = "Node(" + data + ", children=(" + 
                                children.map(_.data).mkString(",") + 
                                "))"
}

val tree = Node("root", List(
  Node("/a", List(
    Node("/a/1", Nil),
    Node("/a/2", Nil)
  )),
  Node("/b", List(
    Node("/b/1", List(
      Node("/b/1/x", Nil),
      Node("/b/1/y", …
Run Code Online (Sandbox Code Playgroud)

scala breadth-first-search

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

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

如何从AsymmetricCipherKeyPair获取PublicKey,而不是publickeycipher参数?

我使用Bouncy Castle软件包在平台上生成密钥对.

SecureRandom random = new SecureRandom();

ECKeyPairGenerator pGen = new ECKeyPairGenerator();

ECKeyGenerationParameters genParam = new ECKeyGenerationParameters(params,random);

pGen.init(genParam);

AsymmetricCipherKeyPair pair = pGen.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

这里pair是类型AsymmetricCipherKeyPair.而且,我需要使用这一对在服务器上生成X509V1Certificate.但是,X509Certificate setPublicKey(PublicKey pubkey)只接受类型的对象PublicKey.所以我需要PublicKeyAsymmetricCipherKeyPair服务器检索一个.但是,我得到了ECPublicKeyParameters,这在setPublicKey方法中是不被接受的.

所以,我在这里的要求是得到PublicKey一个AsymmetricCipherKeyPair.

java bouncycastle java-me x509certificate

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

串行I/O重叠/非重叠Windows/Windows CE

对不起,这不是一个问题,而是帮助人们解决这些特殊问题.我正在处理的问题需要使用串行I/O,但主要是在Windows CE 6.0下运行.但是,最近我被问到应用程序是否也可以在Windows下运行,所以我开始着手解决这个问题.我确实花了很多时间环顾四周,看看是否有人得到了我正在寻找的答案,这些都是在很多错误信息和一些事情中基本上都是错误的事情.所以解决了这个问题,我想我会和每个人分享我的发现,所以任何遇到这些困难的人都会得到答案.

在Windows CE下,支持OVERLAPPED I/O. 这意味着通过串口的双向通信可能非常麻烦.主要的问题是,当您等待来自串行端口的数据时,您无法发送数据,因为这样做会导致主线程阻塞,直到读取操作完成或超时(取决于您是否设置了超时)

像大多数人一样做串行I/O,我有一个读取器串行线程设置用于读取串行端口,它使用WaitCommEvent()和EV_RXCHAR掩码来等待串行数据.现在,这就是Windows和Windows CE出现问题的地方.

如果我有这样一个简单的读者线程,作为一个例子: -

UINT SimpleReaderThread(LPVOID thParam)
{
    DWORD eMask;
    WaitCommEvent(thParam, &eMask, NULL);
    MessageBox(NULL, TEXT("Thread Exited"), TEXT("Hello"), MB_OK);
}
Run Code Online (Sandbox Code Playgroud)

显然,在上面的例子中,我没有从串口或任何读取数据和我假设thParam包含打开的句柄通讯端口等.现在的问题是在Windows下当你的线程执行,并打WaitCommEvent(),您的读者线程将进入休眠状态等待串口数据.好的,这很好,应该如此,但是...你如何结束这个线程并让MessageBox()出现?事实证明,它实际上并不那么容易,并且它在执行其串行I/O方面是Windows CE和Windows之间的根本区别.

在Windows CE,你可以做几件事情,使WaitCommEvent()告吹,如SetCommMask(COMMPORT_HANDLE,0),甚至CloseHandle的(COMMPORT_HANDLE).这将允许您正确终止线程,因此释放串口以便您再次开始发送数据.但是这些东西都不能在Windows下运行,并且两者都会导致你调用它们的线程在WaitCommEvent()完成时等待.那么,你如何结束Windows下的WaitCommEvent()?那么,通常你会使用重叠I/O和线程阻塞不会是一个问题,但由于该解决方案必须与Windows CE兼容以及,重叠I/O是不是一种选择.有一两件事可以在Windows下做结束WaitCommEvent(),这是调用CancelSynchronousIo()函数,这将结束您的WaitCommEvent(),但要注意这可能是设备相关.CancelSynchronousIo()的主要问题是Windows CE也不支持它,所以你运气不好用于解决这个问题!

你是怎么做到的?事实是,要解决此问题,您根本无法使用WaitCommEvent(),因为无法在Windows CE支持的Windows上终止此功能.然后,您将使用ReadFile(),它会在读取NON OVERLAPPED I/O时再次阻塞,这与Comm Timeouts一起使用.

使用ReadFile()和COMMTIMEOUTS结构意味着您必须有一个紧密循环等待您的串行数据,但如果您没有收到大量的串行数据,它应该不是问题.此外,以小超时结束循环的事件也将确保将资源传递回系统,并且您不会将处理器置于100%负载下.以下是我提出的解决方案,如果您认为可以改进,我会很感激您的反馈意见.

typedef struct
{
    UINT8 sync;
    UINT8 op
    UINT8 dev;
    UINT8 node;
    UINT8 data;
    UINT8 csum;
} COMMDAT;

COMSTAT cs = {0};
DWORD byte_count;
COMMDAT cd;

ZeroMemory(&cd, sizeof(COMMDAT));
bool recv = false;
do
{
    ClearCommError(comm_handle, 0, &cs);
    if (cs.cbInQue …
Run Code Online (Sandbox Code Playgroud)

windows io serial-port windows-ce

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

Arduino 和 PHP 通过串行传入字节读取

我有 PHP 脚本用于通过网站控制 Arduino 的二极管,但我遇到了问题。

我的Arduino代码是:

int green = 8;
int incomingbyte;

void setup()
{
  Serial.begin(9600);
  pinMode(green,OUTPUT);
}

void loop()
{
  if(Serial.available() > 0)
  {
    incomingbyte = Serial.read();
  }
  if(incomingbyte == '0'){
  digitalWrite(green,HIGH);
  }
  if(incomingbyte == '1'){
  digitalWrite(green,LOW);
  }
}
Run Code Online (Sandbox Code Playgroud)

我的 PHP 代码是:

<?php

error_reporting(E_ALL); 
ini_set("display_errors", 1);  

if (isset($_GET['action'])) {

    require("php_serial.class.php");

        $serial = new phpSerial();
        $serial->deviceSet("COM3");
        $serial->confBaudRate(9600);
        $serial->deviceOpen();

if ($_GET['action'] == "green1") {

        $serial->sendMessage("0\r");

} else if ($_GET['action'] == "green0") {

        $serial->sendMessage("1\r");
}

$serial->deviceClose();

}
Run Code Online (Sandbox Code Playgroud)

我的 HTML 代码:

<!DOCTYPE html> …
Run Code Online (Sandbox Code Playgroud)

html php serial-port arduino

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