小编dso*_*ano的帖子

OS X上的fprintf线程安全吗?

OS X上的fprintf线程安全吗?如果是这样,这在哪里记录?

macos printf thread-safety

7
推荐指数
2
解决办法
967
查看次数

C write()在调用close(fd)之前不发送数据

所以我有这个测试代码通过USB串口发送"HELLO":

int fd;
struct termios tty;

if((fd = open("/dev/ttyUSB0", O_WRONLY|O_NONBLOCK|O_NOCTTY)) == -1){
err(1, "Cannot open write on /dev/ttyUSB0");
}

tcgetattr(fd, &tty);
tty.c_iflag = 0;
tty.c_oflag = 0;
tty.c_lflag = 0;
tty.c_cflag = 0;
tty.c_cc[VMIN] = 0;
tty.c_cc[VTIME] = 0;
cfsetospeed(&tty, B19200);
cfsetispeed(&tty, B19200);
tty.c_cflag |= CREAD|CRTSCTS|HUPCL|CS8;
tcsetattr(fd, TCSANOW, &tty);

printf("Write: %i\n", write(fd, "HELLO", 5));

sleep(5);

if(close(fd) != 0){
warn("Could not close write fd");
}
Run Code Online (Sandbox Code Playgroud)

程序执行正常,"HELLO"被发送,但有一个问题.调用write()函数时似乎没有发送"HELLO",而是在文件描述符关闭时发送.我添加了上面的sleep(5)行来测试这个理论,果然,"HELLO"在程序执行后约5秒发送.如何在write()命令之后立即发送"HELLO"而不是close()?

c linux serial-port tty

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

如何通过串口发送浮动

什么是派出最好的方式float,double以及int16通过串行上的Arduino?

Serial.print(),因为只有发送值ASCII编码.但我想将值作为字节发送.Serial.write()接受字节和字节数组,但是将值转换为字节的最佳方法是什么?

我试着投了int16一个byte*,没有运气.我也使用了memcpy,但它使用了很多CPU周期.Arduino使用普通的C/C++.这是一款ATmega328微控制器.

c c++ serial-port bytearray arduino

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

串行数据的二进制通信协议解析器设计

我正在重新审视字节流的通信协议解析器设计(串行数据,一次接收1个字节).

数据包结构(不能更改)是:

|| Start Delimiter (1 byte) | Message ID (1 byte) | Length (1 byte) | Payload (n bytes) | Checksum (1 byte) ||
Run Code Online (Sandbox Code Playgroud)

过去,我已经采用程序状态机方法实现了这样的系统.当每个数据字节到达时,状态机被驱动以查看输入数据一次/一个字节是否适合有效数据包,并且一旦整个数据包被组装,基于消息ID的switch语句执行适当的消息处理程序.在一些实现中,解析器/状态机/消息处理程序循环位于其自己的线程中,以便不对串行数据接收的事件处理程序造成负担,并且由指示字节已被读取的信号量触发.

我想知道是否有更优雅的解决方案来解决这个常见问题,利用C#和OO设计的一些更现代的语言功能.任何可以解决这个问题的设计模式?事件驱动vs polled vs组合?

我很想听听你的想法.谢谢.

Prembo.

c# design-patterns serial-port communication protocols

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

正确释放串行端口

我正在用c#编写一个应用程序,利用SerialPort该类与一些设备进行通信.现在我遇到的最大问题是如何在那里正确释放资源,因为在尝试使用已经使用的串口时会立即出现异常.

由于通常GC应该处理大部分工作,我有点想法还有什么可以尝试...

主要是我尝试了两件事(按照我的逻辑)应该做的工作.我使用基于会话的通信,所以我在每次通信之前和之后调用一个OpenPort和一个ClosePort方法 - 所以应该关闭端口.此外,我已经尝试将包含端口的对象设置为null - 但我仍然得到UnauthorizedAccessExceptions所有时间 - 尽管我百分之百确定该SerialPort.Close()方法已被调用.

你们有没有更好的方法来释放端口,所以我不再得到那个例外?

编辑:谢谢你的答案,但Dispose()的东西不起作用 - 我之前尝试过 - 也许我做错了虽然所以这是一个例子我的代码是什么样的:

它实际上非常像Øyvind所建议的,虽然我刚刚添加了IDisposable- 但是也没有用:

所以这将是我的包装类:

class clsRS232 : IDisposable
{
  public void clsRS232()
  {
    Serialport port = new Serialport("COM1",9600,Parity.none,8,Stopbits.one);
  }
  public void openPort()
  {
     port.Open();
  }
  public void sendfunc(string str)
  {
    port.Write(str);
  }
  public string readfunc()
  {
    port.ReadTo("\n");
  }

  public void Dispose()
  {
     port.Dispose();
  }

}
Run Code Online (Sandbox Code Playgroud)

现在每当我需要rs232通信时,我都会调用这样一个新实例:

   clsRS232 test = new clsRS232;
   test.openport();
   test.sendfunc("test");
   test.Dispose(); …
Run Code Online (Sandbox Code Playgroud)

.net c# serial-port

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

如何延迟关闭并在窗口服务中运行进程

我必须运行一个进程,即Windows关闭时的应用程序,是否有任何方法来延迟Windows关闭并在Windows服务中运行应用程序...

protected override void OnShutdown()
{
    // Add your save code here
    // Add your save code here
    StreamWriter str = new StreamWriter("D:\\Log.txt", true);
    str.WriteLine("Service stoped due to on" + DateTime.Now.ToString());
    str.Close();

    base.OnShutdown();
}
Run Code Online (Sandbox Code Playgroud)

我使用上面的函数覆盖了关闭,我能够写一个日志条目到文本文件,但我之后无法运行应用程序在搜索时我发现延迟低于用户激活关闭后的几秒钟

this.RequestAdditionalTime(250000);

这给关闭事件添加时间延迟25秒,但我无法运行应用程序.任何人都可以提出方法或想法在关机时运行应用程序.

.net c# windows-services winforms

7
推荐指数
2
解决办法
7175
查看次数

Android蓝牙串口/ RFCOMM/SPP,如何更改波特率?

这是非常令人沮丧的,因为我已经尝试了几个星期,甚至没有在互联网上的线索.

我正在研究一个在不同农业硬件上读/写蓝牙串行数据的项目.

大多数这些硬件都是旧的,并且不能改变其SPP的波特率.

我使用android蓝牙聊天作为读/写的基础,我只更改了UUID以允许连接到我拥有的设备

我设法以19,200的糟糕速度从标签阅读器中读取,并且格式很好

但是,我现在卡在波特率为9,600的音阶上,并在我的应用中显示有趣的角色,甚至没有接近应该来自音阶的格式

此项目之前已在旧的Windows Mobile上完成,并且可以在其API中更改波特率

有没有办法在Android中执行此操作,还是我咆哮错误的树?

android serial-port bluetooth rfcomm

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

以线程安全方式发布非线程安全对象字段

我遇到了Java并发问题.是的,我看了几乎完全相同标题的问题,但他们似乎都在寻求微妙的不同之处.是的,我已经阅读了Java Concurrency in Practice.是的,我能看到为什么它是事实上的对话题参考.是的,我已经阅读了专门针对线程安全类中的发布字段的部分.是的,我仍然会问一个关于Java的并发问题,不管我知道有人会简单地指出我那本书.

这让我很难过 - 我知道你可以通过确保具有易变性和/或同步访问的正确读/写命令,以线程安全的方式轻松发布可变原语字段,并且64位原语需要具有原子访问权限由于其读/写操作缺乏原子性.我知道在需要在类的字段的特定"快照"上执行的代码块上使用锁.我完全了解原子包和AtomicLong <>等好东西.

但是我仍然对将非线程安全对象作为线程安全类中的字段发布感到困惑.

从我所看到的,一旦你在getter中返回对它的引用,你就可以在任何时候对调用者提供前所未有的对象内容访问权限.此外,如果你给一个setter,你允许他们将对象引用设置为一个对象,它们可以在他们使用setter的对象之外控制它们.

无论如何,我无法解决从非线程安全对象组成线程安全类而不使它们全部私有/受保护并在类中为所有非线程安全对象创建所有非线程安全对象的线程安全包装器方法让该类的用户可能想要使用.这听起来像是一个样板噩梦.

我的意思是,如果你将一个AtomicReference <>返回给getter中的对象,他们可以使用.get()来再次获得对它的非同步访问.

我考虑的另一种方法是让所有getter基于旧的获取非线程安全对象的新副本,这意味着修改将是无关紧要的,同样适用于setter.但是Java有一个无可救药的复杂系统来克隆对象(浅拷贝与深拷贝与特定拷贝等),这有点让我无法做到这一点.而且,这是如此低效,以至于它不会比使用像Clojure那样为不变性而设计的语言更快.事实上,考虑到这些语言允许多条不可变数据在幕后共享相同的数据,它可能会慢得多.

那么,如何以可行的方式编写已发布的非线程安全对象的线程安全类?

提前致谢.

java concurrency composition thread-safety mutability

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

php-serial无法正常工作

我正在尝试使用PHP让我的Arduino发出信号.每当我运行下面的代码时,它会显示"无效的串口",虽然它有效吗?

<?php

include 'serial_connect.php';

$serial = new phpSerial;

$serial->deviceSet("COM2");

$serial->deviceOpen();

$serial->sendMessage("1000");

$serial->deviceClose();
?>
Run Code Online (Sandbox Code Playgroud)

serial_connect.php类是php-serial,链接在这里:http://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html

这是我的Arduino草图:

int ledPin = 13;

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

void loop() {
    if(Serial.available() > 0) {
        int time = Serial.parseInt();        
        digitalWrite(ledPin, HIGH);
        delay(time);
        digitalWrite(ledPin, LOW);
    }
}
Run Code Online (Sandbox Code Playgroud)

请帮忙.谢谢.

php windows serial-port arduino

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

C#异步串口读取

我有一个类,它使用C#中的DataReceived事件处理程序从串口读取.当我收到数据时,我知道标题将有5个字节,所以我不想对数据做任何事情,直到我至少有.我目前的代码如下:

while (serialPort.BytesToRead<5)
{
//Do nothing while we have less bytes than the header size
}

//Once at least 5 bytes are received, process header
Run Code Online (Sandbox Code Playgroud)

据我了解,这段代码是阻塞的,需要改进.我正在寻找有关如何做到这一点的建议.DataReceived事件处理程序中的另一个事件处理程序是否合适?

asynchronous serial-port blocking

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