Fix issue with CDC device demos causing broken communications when the device tries...
[pub/USBasp.git] / Demos / Device / LowLevel / CDC / CDC.c
index 8a992c7..73b486c 100644 (file)
@@ -49,6 +49,12 @@ CDC_Line_Coding_t LineCoding = { .BaudRateBPS = 9600,
                                  .CharFormat  = OneStopBit,\r
                                  .ParityType  = Parity_None,\r
                                  .DataBits    = 8            };\r
+                                                       \r
+/** Indicates if the host has set the device line encoding. Until the line encoding is set by the host, the device should\r
+ *  not attempt to send any bytes.\r
+ */     \r
+bool LineEncodingSet = false;\r
+\r
 \r
 #if 0\r
 /* NOTE: Here you can set up a standard stream using the created virtual serial port, so that the standard stream functions in\r
@@ -59,6 +65,9 @@ static int CDC_putchar(char c, FILE *stream)
 {        \r
        Endpoint_SelectEndpoint(CDC_TX_EPNUM);\r
 \r
+       if (!(LineEncodingSet))\r
+         return -1;\r
+       \r
        while (!(Endpoint_IsReadWriteAllowed()))\r
        {\r
                if (USB_DeviceState != DEVICE_STATE_Configured)\r
@@ -74,7 +83,10 @@ static int CDC_putchar(char c, FILE *stream)
 static int CDC_getchar(FILE *stream)\r
 {\r
        int c;\r
-         \r
+\r
+       if (!(LineEncodingSet))\r
+         return -1;\r
+\r
        Endpoint_SelectEndpoint(CDC_RX_EPNUM);\r
        \r
        for (;;)\r
@@ -216,6 +228,9 @@ void EVENT_USB_UnhandledControlPacket(void)
 \r
                                /* Read the line coding data in from the host into the global struct */\r
                                Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));\r
+                               \r
+                               /* Indicate that the line encoding has been set, and the device may now send data */\r
+                               LineEncodingSet = true;\r
 \r
                                /* Finalize the stream transfer to clear the last packet from the host */\r
                                Endpoint_ClearIN();\r
@@ -299,7 +314,7 @@ void CDC_Task(void)
        {\r
                ActionSent = false;\r
        }\r
-       else if (ActionSent == false)\r
+       else if ((ActionSent == false) && LineEncodingSet)\r
        {\r
                ActionSent = true;\r
 \r