小编jco*_*der的帖子

USB HID协议问题

我正在使用通用HID接口在PIC 18F2550上实现USB .我已经设置了HID配置文件配置,以便为输入和输出提供单个64字节消息.

现在它基本上工作了.设备在Windows中注册OK.我可以在PC上的程序中找到它,并可以向它发送和接收数据.但问题是这样 - 从PC到PIC的消息被截断为EP0端点缓冲区的大小.

在我进一步调试之前,我想尝试澄清我对USB协议的理解,并检查我是否正确.

假设EP0输入缓冲区是8个字节.据我所知,PC端将发送一个8字节的控制包.在那里有数据的字节长度.然后它将发送一系列8字节数据包,PIC端必须确认每一个.

据我所知,PC端通过查看设备描述符中的最大数据包大小字段来了解每个数据包的大小,并将相应的消息分成多个数据包.

在我寻找代码的更多时间之前,有人可以确认这基本上是正确的吗?如果EP0缓冲区大小是8字节,那么PC应该知道这一点,因为我上面提到的配置字段并发送多个数据包?

如果我在PIC 64字节上创建接收缓冲区,那么我得到64字节的消息,这足以满足我的需要,但我不喜欢不理解为什么它不适用于小缓冲区,有一天我会无论如何可能还需要他们.

欢迎任何建议或信息.

usb protocols hid pic

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

Vector迭代器的多个线程

我已将向量声明为

typedef std :: vector <unsigned int> SampleList;

并在类中声明了Samplist类型的成员变量。

我正在从具有多个线程的另一个类访问此向量。

我正在添加,删除,从不同线程读取值值。我经常像下面这样阅读此值。

SampleList* listSample;
listSample= ptr->GetList();
while(true)
{   
    SampleList::iterator itrSample;
    itrSample = listSample->begin();

    unsigned int nId = 0;


    for ( ; itrSample < listRoundRobinSensor->end(); ++itrSample )
    {           
         nId =(unsigned int) *itrSample ;
    }

}
Run Code Online (Sandbox Code Playgroud)

对于itrSample值变成垃圾值一样4261281277

我尝试用来保护此列表critical secion。仍然我有这个问题。您可以提出建议并解决。这将对我非常有帮助。

c++ multithreading stdvector

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

严格的别名规则和 std::copy

我有一个字符数组,其中包含“序列化”数据,我需要将其解释为“int”。以前,我只是将指向位置的指针转换为“int*”,并取消引用它以获取 int 数据,但尽管它对我来说效果很好,但它违反了严格的别名规则,因此出现了未定义的行为。

所以现在我使用 memcpy 将字节复制到 int 中,我相信这不是未定义的行为。但是我可以使用“std::copy”吗?

例如

char data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int i;

std::copy(data, data+sizeof(int), reinterpret_cast<char*>(&i));
Run Code Online (Sandbox Code Playgroud)

这本身并没有违反严格的别名规则,但任何可能的实现都会这样做......但是 memcpy 也有同样的问题,这是“允许的”。

这是标准兼容代码还是我需要坚持使用 memcpy?

编辑:我应该补充一点,我很欣赏关于如何最好地做到这一点的答案,它们很有趣,但我的问题更多的是这是否合法,而不是我该如何做到这一点。

c++

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

在 zig 中搜索结构体的 ArrayList

我希望这个问题有一个非常简单的答案,关于如何在 zig 中做好这件事。

我想搜索某个结构的 ArrayList 以通过其中一个字段查找记录。
在 C++ 中,我会考虑使用 std::find_if 和 lambda,但 zig 标准库中似乎没有类似的东西,除非我错过了一些东西。

有没有比下面这样的简单循环更好/更惯用的方法?

const std = @import("std");

const Person = struct {
    id: i32,
    name: []const u8
};

pub fn main() !void {

    const allocator = std.heap.page_allocator;

    var data = std.ArrayList(Person).init(allocator);
    defer data.deinit();

    try data.append(.{.id = 1, .name = "John"});
    try data.append(.{.id = 2, .name = "Dave"});
    try data.append(.{.id = 8, .name = "Bob"});
    try data.append(.{.id = 5, .name = "Steve"});

    // Find the id of the person …
Run Code Online (Sandbox Code Playgroud)

zig

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

使用std :: mutex发布并获取

这是一个关于C++标准的问题.我只能访问标准草案,所以如果官方标准不同,我道歉.如果我误解了它是如何工作的,请随时纠正我.

假设我有两个线程,一个写入字符串,另一个复制该字符串的内容.我保护对它们的访问使用std::mutex myMutex; 我知道你应该通常使用RAII类来锁定,我只是明确地使用了锁定和解锁来使示例更加明确.

// Global variable
std::string message;
std::mutex myMutex;

// Thread one
myMutex.lock();
message = "Hello";
myMutex.unlock();

// Thread two
myMutex.lock();
std::string copy = message;
myMutex.unlock();
Run Code Online (Sandbox Code Playgroud)

我的理解是,为了使它在线程之间可靠地工作,线程1必须在设置字符串后执行Release操作,并且两个必须在读取字符串之前执行Acquire.

阅读C++ 11的标准草案我看不到任何说明这样std::mutex做的事情,虽然很明显它是预期的,或者互斥体对任何东西都没用.

有人能指点我看相关部分吗?标准中的措辞对于随意的读者来说往往不是很清楚:)

c++ c++11

4
推荐指数
1
解决办法
1562
查看次数

VHDL FSM中的状态管理

我在VHDL中看到的很多FSM都是通过next_state在FSM逻辑中设置变量" "然后将其单独分配给流程外的状态变量来工作的.

如果只是写" state <= state_five;" 有什么不对 改为设置下一个状态?我假定有有这么多人使用一个单独的下一个状态变量,而不是直接分配给国家,因为我看到这一切的时候有原因的,但据我可以告诉有不同之处在于它使代码没有什么区别更长更复杂的外观.

我错过了什么吗?或者只是一个风格问题?如果是这样,为什么这种风格更好,对我来说似乎没必要.

vhdl fsm

4
推荐指数
1
解决办法
1597
查看次数

我如何static_assert类型?

受到这个问题的一个评论的启发,我想在我的代码中写这个,因为我可能做了错误的假设,如果我将代码移植到两种类型不同的平台,则需要调查.

static_assert(typeid(float) == typeid(GLfloat), "GLfloat is unexpected type");
Run Code Online (Sandbox Code Playgroud)

但是这不会编译,因为 error: call to non-constexpr function ‘bool std::type_info::operator==(const std::type_info&) const’

不过我可以这样写: -

static_assert(sizeof(float) == sizeof(GLfloat), "GLfloat is unexpected size");
Run Code Online (Sandbox Code Playgroud)

它的工作方式与预期一致.如果我在新平台上的假设是错误的,那么很可能足以给我一个编译时错误,但我想知道是否有任何方法可以实现我真正想要的 - 比较实际类型?

c++

4
推荐指数
1
解决办法
660
查看次数

平台为什么选择签名char?

我看到很多关于签名/未签名字符的答案,但不是这个问题,所以如果已经有答案,请随时关闭/复制.

我知道在C和C++中,数据类型'char'可以是有符号或无符号的.我知道不同的平台选择不同,但是x86和我个人使用的所有其他平台都选择"char"进行签名.

在我看来,选择一个unsigned char有一些小的优点,例如你可以使用该值作为数组索引,如果你想为了对值进行分类,但可能有理由,无论是语言相关,还是在目标架构使签名成为更好的选择.

这些原因是什么?

c c++

4
推荐指数
1
解决办法
258
查看次数

在 windows / direct3d 中使用 ttf 文件中的字体

我正在使用 direct3d 9 并使用 D3DXCreateFont 创建一个字体对象,我可以用它来将文本写入屏幕。但是我想使用 TTF 文件中的字体而不是已安装的字体。有没有办法从 TTF 文件创建字体对象,而无需先将字体安装到我不想做的 Windows 中?

windows directx fonts direct3d

3
推荐指数
1
解决办法
2533
查看次数

混合c ++标准字符串和windows API

许多Windows API采用指向缓冲区和大小元素的指针,但结果需要进入c ++字符串.(我在这里使用windows unicode,所以它们是wstrings)

这是一个例子: -

#include <iostream>
#include <string>
#include <vector>
#include <windows.h>

using namespace std;

// This is the method I'm interested in improving ...
wstring getComputerName()
{
    vector<wchar_t> buffer;
    buffer.resize(MAX_COMPUTERNAME_LENGTH+1);
    DWORD size = MAX_COMPUTERNAME_LENGTH;

    GetComputerNameW(&buffer[0], &size);

    return wstring(&buffer[0], size);
}

int main()
{
    wcout << getComputerName() << "\n";
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是编写getComputerName函数的最佳方法,以便它更好地适应C++,还是有更好的方法?除非我错过了什么,否则我没有看到任何方式直接使用字符串而不通过向量?它工作正常,但不知何故看起来有点难看.问题不在于特定的API,它只是一个方便的例子.

c++ windows

3
推荐指数
1
解决办法
1820
查看次数

标签 统计

c++ ×6

windows ×2

c ×1

c++11 ×1

direct3d ×1

directx ×1

fonts ×1

fsm ×1

hid ×1

multithreading ×1

pic ×1

protocols ×1

stdvector ×1

usb ×1

vhdl ×1

zig ×1