Работа с USB: программа не видит устройства - C#

Узнай цену своей работы

Формулировка задачи:

Столкнулся с проблемой, когда- то писал программу которая слушала com- порт. Работала как надо, видела устройства. Сейчас надо работать с USB устройством по такому же принципу, думал что программа подойдет, так как все это serial port, но программа USB девайс не видит, хотя гипертерминал видит. Что не так? Может ли это быть из-за того что сейчас использую C# Express, а раньше Visual Studio была. Вот текст программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
 
namespace COMP
{
 
    public class PortChat
    {
        static bool contine;
        static SerialPort Port;
 
        public static void Main()
        {
            
            string message;
            /*StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;*/
            Thread readThreader = new Thread(Read);
            Port = new SerialPort();
            Port.ReadTimeout = 500;
            Port.WriteTimeout = 500;
            Port.Open();
            contine = true;
            readThreader.Start();
 
            Console.WriteLine("Type Q to exit");
 
            while (contine)
            {
                message = Console.ReadLine();
                if (message == "q")
                {
                    contine = false;
 
                }
                /*if (stringComparer.Equals("q", message))
                {
                    contine = false;
                }*/
                else
                {
                    Port.WriteLine(
                    String.Format("{0}",message));
                }
            }
            readThreader.Join();
            Port.Close();
        }
            public static void Read()
        {           
                while (contine)
                {
                    try
                    { 
                        string message = Port.ReadLine();
                        Console.WriteLine(message);
                      
                    catch (TimeoutException)
                    {
                    }
                }
 
        }
    }
}

Решение задачи: «Работа с USB: программа не видит устройства»

textual
Листинг программы
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>   /* нужно для usbdrv.h */
#include "usbdrv.h"
 
 
struct dataexchange_t       // Описание структуры для передачи данных
{
   uchar b1;        // Я решил для примера написать структуру на 3 байта.
   uchar b2;        // На каждый байт подцепим ногу из PORTB. Конечно это
   uchar b3;        // не рационально (всего то 3 бита нужно).
};                  // Но в целях демонстрации в самый раз.
                    // Для наглядности прикрутить по светодиоду и созерцать :)
 
 
struct dataexchange_t pdata = {0, 0, 0};
 
 
PROGMEM char usbHidReportDescriptor[22] = { // USB report descriptor         // Дескриптор описывает структуру пакета данных для обмена
    0x06, 0x00, 0xff,                       // USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                             // USAGE (Vendor Usage 1)
    0xa1, 0x01,                             // COLLECTION (Application)
    0x15, 0x00,                             //    LOGICAL_MINIMUM (0)        // min. значение для данных
    0x26, 0xff, 0x00,                       //    LOGICAL_MAXIMUM (255)      // max. значение для данных, 255 тут не случайно, а чтобы уложиться в 1 байт
    0x75, 0x08,                             //    REPORT_SIZE (8)            // информация передается порциями, это размер одного "репорта" 8 бит
    0x95, sizeof(struct dataexchange_t),    //    REPORT_COUNT               // количество порций (у нашем примере = 3, описанная выше структура передастся за три репорта)
    0x09, 0x00,                             //    USAGE (Undefined)
    0xb2, 0x02, 0x01,                       //    FEATURE (Data,Var,Abs,Buf)
    0xc0                                    // END_COLLECTION
};
/* Здесь мы описали только один report, из-за чего не нужно использовать report-ID (он должен быть первым байтом).
 * С его помощью передадим 3 байта данных (размер одного REPORT_SIZE = 8 бит = 1 байт, их количество REPORT_COUNT = 3).
 */
 
 
/* Эти переменные хранят статус текущей передачи */
static uchar    currentAddress;
static uchar    bytesRemaining;
 
 
/* usbFunctionRead() вызывается когда хост запрашивает порцию данных от устройства
 * Для дополнительной информации см. документацию в usbdrv.h
 */
uchar   usbFunctionRead(uchar *data, uchar len)
{
    if(len > bytesRemaining)
        len = bytesRemaining;
 
    uchar *buffer = (uchar*)&pdata;
 
    if(!currentAddress)        // Ни один кусок данных еще не прочитан.
    {                          // Заполним структуру для передачи
        if ( PINB & _BV(1) )
            pdata.b1 = 1;
        else
            pdata.b1 = 0;
 
 
        if ( PINB & _BV(2) )
            pdata.b2 = 1;
        else
            pdata.b2 = 0;
 
 
        if ( PINB & _BV(3) )
            pdata.b3 = 1;
        else
            pdata.b3 = 0;
    }
 
    uchar j;
    for(j=0; j<len; j++)
        data[j] = buffer[j+currentAddress];
 
    currentAddress += len;
    bytesRemaining -= len;
    return len;
}
 
 
/* usbFunctionWrite() вызывается когда хост отправляет порцию данных к устройству
 * Для дополнительной информации см. документацию в usbdrv.h
 */
uchar   usbFunctionWrite(uchar *data, uchar len)
{
    if(bytesRemaining == 0)
        return 1;               /* конец передачи */
 
    if(len > bytesRemaining)
        len = bytesRemaining;
 
    uchar *buffer = (uchar*)&pdata;
    
    uchar j;
    for(j=0; j<len; j++)
        buffer[j+currentAddress] = data[j];
 
    currentAddress += len;
    bytesRemaining -= len;
 
    if(bytesRemaining == 0)     // Все данные получены
    {                           // Выставим значения на PORTB
        if ( pdata.b1 )
            PORTB |= _BV(1);
        else
            PORTB &= ~_BV(1);
 
 
        if ( pdata.b2 )
            PORTB |= _BV(2);
        else
            PORTB &= ~_BV(2);
 
 
        if ( pdata.b3 )
            PORTB |= _BV(3);
        else
            PORTB &= ~_BV(3);
    }
 
    return bytesRemaining == 0; /* 0 означает, что есть еще данные */
}
 
/* ------------------------------------------------------------------------- */
 
usbMsgLen_t usbFunctionSetup(uchar data[8])
{
usbRequest_t    *rq = (void *)data;
 
    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){    /* HID устройство */
        if(rq->bRequest == USBRQ_HID_GET_REPORT){  /* wValue: ReportType (highbyte), ReportID (lowbyte) */
            // у нас только одна разновидность репорта, можем игнорировать report-ID
            bytesRemaining = sizeof(struct dataexchange_t);
            currentAddress = 0;
            return USB_NO_MSG;  // используем usbFunctionRead() для отправки данных хосту
        }else if(rq->bRequest == USBRQ_HID_SET_REPORT){
            // у нас только одна разновидность репорта, можем игнорировать report-ID
            bytesRemaining = sizeof(struct dataexchange_t);
            currentAddress = 0;
            return USB_NO_MSG;  // используем usbFunctionWrite() для получения данных от хоста
        }
    }else{
        /* остальные запросы мы просто игнорируем */
    }
    return 0;
}
/* ------------------------------------------------------------------------- */
 
int main(void)
{
    DDRB = 0b00001110;      // PB1,PB2,PB3 - выход
 
    usbInit();
    usbDeviceDisconnect();  // принудительно отключаемся от хоста, так делать можно только при выключенных прерываниях!
    
    uchar i = 0;
    while(--i){             // пауза > 250 ms
        _delay_ms(1);
    }
    
    usbDeviceConnect();     // подключаемся
 
    sei();                  // разрешаем прерывания
 
    for(;;){                // главный цикл программы
        usbPoll();          // эту функцию надо регулярно вызывать с главного цикла, максимальная задержка между вызовами - 50 ms
    }
    return 0;
}
/* ------------------------------------------------------------------------- */

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы