我注意到宏已经出现在 Yandex 表中。我认为这是 JS。如果我错了,请纠正我。我想对它们进行一些实验并使用它们,但我找不到任何文档或代码示例。请提供文档和宏示例的链接。比如,每隔一行都涂成灰色,或者涂成其他一些简单且标准的线条。
主页
/
user-200183
Alexandr's questions
有一个设备通过串行端口随机发送数据包。我想监听端口,接收数据包中接收到的字节并将其写入变量中,以便我可以从那里获取并进一步使用它。我选择队列类型是因为我认为使用它会很方便 - 按照我收到数据包的顺序,我按照该顺序处理它们。我发现了一个问题: Problem getting data from SerialPort in C# service。我尝试了一下,它将所有内容写入文件中,我重写了它以写入队列:
class ComWatcher
{
public ComWatcher(SerialPort serialPort)
{
port = serialPort;
}
SerialPort port;
CancellationTokenSource cts;
private Queue<byte[]> _queueOfBytes = new();
public Queue<byte[]> QueueOfBytes
{
get { return _queueOfBytes; }
set { _queueOfBytes = value; }
}
public async void Start()
{
if (cts != null)
throw new InvalidOperationException("Already started");
cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
try
{
if(!port.IsOpen)
port.Open();
byte[] buf = new byte[16];
var stream = port.BaseStream;
while (!ct.IsCancellationRequested)
{
var actuallyRead = await stream.ReadAsync(buf, 0, buf.Length, ct);
if (actuallyRead == 0) // end of stream
return;
await EnqueueAsync(buf);
}
}
catch (IOException io)
{
Console.WriteLine(io.Message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Stop()
{
var cts = this.cts;
this.cts = null;
if (cts == null)
throw new InvalidOperationException("Not started");
port.Close();
cts.Cancel();
}
public async Task EnqueueAsync(byte[] buf)
{
try
{
await Task.Run(() => QueueOfBytes.Enqueue(buf));
}
catch (Exception ex)
{
Console.WriteLine($"{ex.Message}");
}
}
}
不幸的是,Queue没有WriteAsync,所以我尝试自己写。该代码无法正常工作,因为例如数据包是这样发送的:
[01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16]
结果,可能会出现以下选项:
[01 остальные байты 00],
[02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 01],
[01 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15]
有时,单个字节会丢失或重复,就好像它们是从其他数据包中获取的一样。我怀疑异步有问题。如何通过串行端口读取数据包并写入队列或其他数据类型?
适用于 Raspbian 10 和 Raspbian 11 操作系统上的 Raspberry Pi 的 C# Avalonia 应用程序。您需要播放音频文件(mp3、wav 或任何其他可以使用麦克风录制或通过几个操作录制和转换的音频格式)。无论我查看哪个库,它们都具有 Windows 依赖项。例如,我最后尝试的是NAudio。Unable to load shared library 'Msacm32.dll' or one of its dependencies.
mp3 和wav会显示错误Unable to load shared library 'winmm.dll' or one of its dependencies.
。谷歌搜索后,我意识到这些都是纯粹的 Windows 库。代码是这样的:
var reader = new Mp3FileReader(path);
var waveOut = new WaveOutEvent();
waveOut.Init(reader);
waveOut.Play();