我正在从多个串口读取数据.目前我正在使用自定义信号处理程序(通过设置sa_handler)来比较和唤醒基于文件描述符信息的线程.我正在寻找一种方法,让单个线程具有独特的信号处理程序,在这方面我发现将使用select系统调用.
现在我有以下问题:
如果你觉得这些问题很荒谬,请不要介意.我从未使用过这种串行通信机制.
我正在使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)并且它工作得很好.控制器可能重新启动,因此相同的代码不断重复.
非常感谢你的帮助!:)
如何快速为delphi应用程序生成唯一的计算机ID?我以前用c#很容易做到这一点,但有时失败了.我确实希望ID是"静态的",但我不在乎是因为硬件更改或操作系统重新安装而导致id更改,我打算将其存储在注册表中并在应用启动时检查它,如果它已更改更新注册表.(我知道如何编写注册表部分,我只需要帮助唯一的ID).
谢谢.
我有一个将图像与标签匹配的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)
当然,那不是很好.任何的想法?
谢谢!
在我作为PHP程序员和C#编程初学者的日子里,我一直想知道生成独特序列号的最佳方法,例如Microsoft Office和Microsoft操作系统的工作方式.
有没有人有一个很好的指导如何处理这个,比如生成唯一序列的重要因素,防止重复等.如何创建/验证它们的小例子.
这是我正在谈论的RFC:http://tools.ietf.org/html/rfc1982.
我正在尝试重构一个当前产生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) Rails 3 cattr_accessor 线程安全吗?
我使用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.所以我需要PublicKey从AsymmetricCipherKeyPair服务器检索一个.但是,我得到了ECPublicKeyParameters,这在setPublicKey方法中是不被接受的.
所以,我在这里的要求是得到PublicKey一个AsymmetricCipherKeyPair.
对不起,这不是一个问题,而是帮助人们解决这些特殊问题.我正在处理的问题需要使用串行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) 我有 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) serial-port ×4
php ×2
8051 ×1
arduino ×1
bouncycastle ×1
c ×1
c++ ×1
delphi ×1
embedded ×1
html ×1
io ×1
java ×1
java-me ×1
license-key ×1
scala ×1
sql ×1
unique ×1
unix ×1
windows ×1
windows-ce ×1