我有一个串行设备设置为环回(意味着它将回显它收到的任何字符),我想测量有效的吞吐速度.为此,我希望我可以使用time,如同
time bash -c '...'
Run Code Online (Sandbox Code Playgroud)
哪个' ...'将是一些我可以运行的命令.
现在,第一个问题是我想以2000000 bps的速度使用设备,所以我不能使用 ttylog或屏幕(它们似乎都只能达到115200 bps).但是,使用/dev/ttyUSB0文件(使用文件重定向和cat)似乎工作正常:
# initialize serial port
stty 2000000 -ixon icanon </dev/ttyUSB0
# check settings
stty -a -F /dev/ttyUSB0
# in one terminal - read from serial port
while (true) do cat -A /dev/ttyUSB0 ; done
# in other terminal - write to serial port
echo "1234567890" > /dev/ttyUSB0
# back to first terminal, I now have:
# $ while (true) do …Run Code Online (Sandbox Code Playgroud) JCL库具有条件定义UNITVERSIONING.我不知道为什么这个选项存在,不知道如何使用它.我知道有一个叫做JclUnitVersioning.pas的单位,但找不到用处.
在真正的单词项目中何处使用它?
我有这样的文字:
Run Code Online (Sandbox Code Playgroud)00:00 stuff 00:01 more stuff multi line and going 00:02 still have
所以,我没有一个块结束,只是一个新的块启动.
我想以递归方式获取所有块:
Run Code Online (Sandbox Code Playgroud)1 = 00:00 stuff 2 = 00:01 more stuff multi line and going
等等
波纹管代码只给我这个:
$VAR1 = '00:00';
$VAR2 = '';
$VAR3 = '00:01';
$VAR4 = '';
$VAR5 = '00:02';
$VAR6 = '';
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
my $text = '00:00 stuff
00:01 more stuff
multi line
and going
00:02 still
have
';
my @array = $text =~ m/^([0-9]{2}:[0-9]{2})(.*?)/gms;
print Dumper(@array);
Run Code Online (Sandbox Code Playgroud) OS X上的fprintf线程安全吗?如果是这样,这在哪里记录?
我正在用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) 我必须运行一个进程,即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秒,但我无法运行应用程序.任何人都可以提出方法或想法在关机时运行应用程序.
这是非常令人沮丧的,因为我已经尝试了几个星期,甚至没有在互联网上的线索.
我正在研究一个在不同农业硬件上读/写蓝牙串行数据的项目.
大多数这些硬件都是旧的,并且不能改变其SPP的波特率.
我使用android蓝牙聊天作为读/写的基础,我只更改了UUID以允许连接到我拥有的设备
我设法以19,200的糟糕速度从标签阅读器中读取,并且格式很好
但是,我现在卡在波特率为9,600的音阶上,并在我的应用中显示有趣的角色,甚至没有接近应该来自音阶的格式
此项目之前已在旧的Windows Mobile上完成,并且可以在其API中更改波特率
有没有办法在Android中执行此操作,还是我咆哮错误的树?
我目前正在编写一个通过串行连接与集成伺服器通信的应用程序.
电机以高达1000次/秒的速率发送位置数据.我想要实现的是能够格式化返回的数据(通过剥离空格,新行等)并解析它以从接收的字符串中提取相关数据.
目前,我有数据接收事件处理程序读取数据,使用一系列string.replace方法调用格式化它,并将其附加到充当缓冲区的字符串.然后,使用线程,我不断检查缓冲区,因为它填充特定的分隔符(在我的情况下为"\ r"),表示来自电机的一条消息的结束,然后从缓冲区中删除该消息并将其打印到富有文本域.
这种方法存在两个问题.一个是因为电机以如此高的速率传输位置数据,所以缓冲器填充的速度比线程可以处理的数据快.因此,当我向电机发送命令时,它会立即动作,但响应会延迟几秒钟,因为必须首先处理缓冲区中的所有前面的数据.其次,让两个线程运行一个实现while(true)结构的方法意味着处理器利用率急剧上升,并且在几秒钟内,pc中的风扇最大.
有更好的方法来处理数据吗?
这是我的事件处理程序代码:
//data recieved event handler
private void dataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string tmp;
tmp = sp.ReadExisting();
//cut out any unnecessary characters
tmp = tmp.Replace("\n", "");
tmp = tmp.Replace(",", "\r");
tmp = tmp.Replace(" ", "");
lock (this)
{
//put all received data into the read buffer
readBuffer += tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
这是线程执行的方法:
private void parseBuffer()
{
while (true)
{
//obtain lock, parse one message from buffer
lock (this)
{
if (readBuffer.IndexOf("\r") > 0)
{ …Run Code Online (Sandbox Code Playgroud) 我正在Windows 7下的Delphi 2010 XE RAD Studio上开发Delphi应用程序.我的应用程序不停地在串口上进行讨论.我正在使用AsyncPro for Delphi 2010.串口通信和我开发的计算机上的所有其他工作都很好,没有任何问题.但是,当我的应用程序的发行版本在另一个Windows 7系统上运行时,串行通信完全失败.我们探测了串行通信本身的答案,发现在发送所有字节后不会丢弃请求发送(RTS)线,而在我的开发计算机上,RTS线被正确删除.
即使我明确地将RTS线丢弃到低或假状态,RTS线也不会立即下降,但是在15毫秒之后.因此,我的发布版本上的串行通信失败了.
我是否遗漏了有关Windows 7和串行通信问题的重要信息?
更新:我刚刚发现我的Aysncpro 5.0 for Delphi XE的错误.真奇怪.当我的Delphi XE IDE打开或运行时,我的程序正在完美地进行通信.当我的程序运行时关闭或关闭我的Delphi XE IDE时,相同的程序不能很好地通信或超时.
如果你知道它为什么会发生,请编钟.
任何帮助将不胜感激.
谢谢,
我遇到了Java并发问题.是的,我看了几乎完全相同标题的问题,但他们似乎都在寻求微妙的不同之处.是的,我已经阅读了Java Concurrency in Practice.是的,我能看到为什么它是事实上的对话题参考.是的,我已经阅读了专门针对线程安全类中的发布字段的部分.是的,我仍然会问一个关于Java的并发问题,不管我知道有人会简单地指出我那本书.
这让我很难过 - 我知道你可以通过确保具有易变性和/或同步访问的正确读/写命令,以线程安全的方式轻松发布可变原语字段,并且64位原语需要具有原子访问权限由于其读/写操作缺乏原子性.我知道在需要在类的字段的特定"快照"上执行的代码块上使用锁.我完全了解原子包和AtomicLong <>等好东西.
但是我仍然对将非线程安全对象作为线程安全类中的字段发布感到困惑.
从我所看到的,一旦你在getter中返回对它的引用,你就可以在任何时候对调用者提供前所未有的对象内容访问权限.此外,如果你给一个setter,你允许他们将对象引用设置为一个对象,它们可以在他们使用setter的对象之外控制它们.
无论如何,我无法解决从非线程安全对象组成线程安全类而不使它们全部私有/受保护并在类中为所有非线程安全对象创建所有非线程安全对象的线程安全包装器方法让该类的用户可能想要使用.这听起来像是一个样板噩梦.
我的意思是,如果你将一个AtomicReference <>返回给getter中的对象,他们可以使用.get()来再次获得对它的非同步访问.
我考虑的另一种方法是让所有getter基于旧的获取非线程安全对象的新副本,这意味着修改将是无关紧要的,同样适用于setter.但是Java有一个无可救药的复杂系统来克隆对象(浅拷贝与深拷贝与特定拷贝等),这有点让我无法做到这一点.而且,这是如此低效,以至于它不会比使用像Clojure那样为不变性而设计的语言更快.事实上,考虑到这些语言允许多条不可变数据在幕后共享相同的数据,它可能会慢得多.
那么,如何以可行的方式编写已发布的非线程安全对象的线程安全类?
提前致谢.