Hi,
I'm using lpcxpresso55s16_dev_composite_cdc_msc_bm example with a small modification in "kUSB_DeviceCdcEventRecvResponse" event which prints the received data.
case kUSB_DeviceCdcEventRecvResponse:
{
if ((1 == g_deviceComposite_hs->cdcVcomBulk.attach) && (1 == g_deviceComposite_hs->cdcVcomBulk.startTransactions))
{
g_deviceComposite_hs->cdcVcomRecvSizeBulk = epCbParam->length;
if (!g_deviceComposite_hs->cdcVcomRecvSizeBulk)
{
/* Schedule buffer for next receive event */
error = USB_DeviceCdcAcmRecv(handle, USB_CDC_VCOM_DIC_BULK_OUT_ENDPOINT, s_currRecvBuf_BULK,
g_cdcVcomDicEndpoints_BULK[0].maxPacketSize);
}
usb_echo("%d NEW Bytes:\r\n", g_deviceComposite_hs->cdcVcomRecvSizeBulk);
for(int i = 0 ; i < g_deviceComposite_hs->cdcVcomRecvSizeBulk ; i ++ ) {
usb_echo("%X ", s_currRecvBuf_BULK[i]);
if(i % 16 == 0 && i != 0) usb_echo("\r\n");
if(i % 8 == 0 && i != 0) usb_echo(" ");
}
usb_echo("\r\n");
error = USB_DeviceCdcAcmSend(g_deviceComposite_hs->cdcVcomBulk.cdcAcmHandle, USB_CDC_VCOM_DIC_BULK_IN_ENDPOINT, "", 0);
g_deviceComposite_hs->cdcVcomRecvSizeBulk = 0;
g_deviceComposite_hs->cdcVcomSendSizeBulk = 0;
}
}
break;
I'm sending a 512B packet using a C code to the relevant CDC port.
When I send the data, The data which is been sent is:
65 E4 9F 40 A2 37 4F B6 D2 D0 AE 99 AC E2 A4 22 8F
99 B4 45 4A 2E A4 D1 99 22 23 E7 E0 D2 6 3D 72
92 CE AF 25 EA 7E 59 D7 56 1 A BE 4D 91 13 B0
4B 33 62 F1 84 62 30 56 A0 2E 2A FB 7 70 E7 9A
C9 64 62 2 15 19 E5 A1 F7 85 53 8B 94 D7 E7 8E
B8 7E 6 C 9A 53 90 77 60 FF 9F E8 65 87 BD AD
8A 2C 70 A5 12 F9 D5 44 48 7D 47 79 D0 83 63 96
F3 D0 67 F0 4F 49 63 4A 5E 6E 10 52 3F 9 C5 CD
9E 2C C2 AA 55 9E 31 ED 6D E5 A9 2A 1F 4C 72 D2
C8 96 2 3A 8A 4A 14 9B 26 AF 99 78 FB 15 E3 52
5F 53 D1 C0 21 59 A2 0 C 6F 5B AE 15 F2 19 DC
D3 81 E3 11 ED 68 90 A 18 A1 41 AD 60 B6 1F 5B
54 98 93 4 1E 0 8E E2 FC 37 9C E8 C2 99 76 A5
8B C2 F7 43 60 7A 39 17 B3 8B 20 31 2 C4 D 86
2B 5C AC 4A 1F 4E B3 7 7B 63 5F 81 AD A5 B3 EF
82 6 60 46 A 24 7B 7F 75 F5 72 D4 B0 47 55 6
F9 5F C9 9E D2 D7 BF 6F 39 9F C 37 11 35 12 4A
2C C6 8B 5A A8 A9 A5 CE BB EB E9 66 81 57 66 E2
5C F 85 D9 DE 59 1C E DF 15 E7 8 30 5D CA A7
33 7E 69 D4 39 67 18 D7 55 B3 E3 1E 9A 11 B9 1F
5E FE 98 34 FB F3 30 7F DD D9 29 DC 8C 16 50 1A
2B 48 0 5D 62 6E 10 E4 C5 1D 59 5D B4 6C 1A 25
32 5F 5F 9B 1B 8F D4 CE 94 9C E6 76 3D FC A6 45
2A DD 2F F2 8E 20 D0 69 66 1B 5E 9D F9 26 6C BC
41 12 CB 10 2F F3 6 24 7A 2D 6D F2 8D 9B BD 6C
A5 6A A5 9A 68 B1 BE 7A E6 B9 12 AA 43 51 D6 20
1C C3 A B 33 4C 9A E4 94 6 2 7E 79 F4 6C 2B
E4 26 65 71 B4 B9 1D 8A AA DF 77 9A AE FD 5 5F
9D 6E 18 D9 A0 ED D1 68 80 1D FE BC 11 89 21 30
D9 AB E2 83 6A D4 59 12 43 13 8 2F 57 37 35 CF
47 B3 7D 54 A1 A9 6D A8 CE A9 C2 64 8E 4B C9 F
E4 D6 F8 13 54 25 89 83 6F E7 CF B4 6F 87 BB
The problem is that the data isn't received in one event, it is received in many events:
43 NEW Bytes:
65 E4 9F 40 A2 37 4F B6 D2 D0 AE 99 AC E2 A4 22 8F
99 B4 45 4A 2E A4 D1 99 22 23 E7 E0 D2 6 3D 72
92 CE AF 25 EA 7E 59 D7 56 1
2 NEW Bytes:
D A
82 NEW Bytes:
BE 4D 91 13 B0 4B 33 62 F1 84 62 30 56 A0 2E 2A FB
7 70 E7 9A C9 64 62 2 15 19 E5 A1 F7 85 53 8B
94 D7 E7 8E B8 7E 6 C 9A 53 90 77 60 FF 9F E8
65 87 BD AD 8A 2C 70 A5 12 F9 D5 44 48 7D 47 79
D0 83 63 96 F3 D0 67 F0 4F 49 63 4A 5E 6E 10 52
3F
1 NEW Bytes:
9
57 NEW Bytes:
C5 CD 9E 2C C2 AA 55 9E 31 ED 6D E5 A9 2A 1F 4C 72
D2 C8 96 2 3A 8A 4A 14 9B 26 AF 99 78 FB 15 E3
52 5F 53 D1 C0 21 59 A2 0 C 6F 5B AE 15 F2 19
DC D3 81 E3 11 ED 68 90
2 NEW Bytes:
D A
60 NEW Bytes:
18 A1 41 AD 60 B6 1F 5B 54 98 93 4 1E 0 8E E2 FC
37 9C E8 C2 99 76 A5 8B C2 F7 43 60 7A 39 17 B3
8B 20 31 2 C4 D 86 2B 5C AC 4A 1F 4E B3 7 7B
63 5F 81 AD A5 B3 EF 82 6 60 46
2 NEW Bytes:
D A
173 NEW Bytes:
24 7B 7F 75 F5 72 D4 B0 47 55 6 F9 5F C9 9E D2 D7
BF 6F 39 9F C 37 11 35 12 4A 2C C6 8B 5A A8 A9
A5 CE BB EB E9 66 81 57 66 E2 5C F 85 D9 DE 59
1C E DF 15 E7 8 30 5D CA A7 33 7E 69 D4 39 67
18 D7 55 B3 E3 1E 9A 11 B9 1F 5E FE 98 34 FB F3
30 7F DD D9 29 DC 8C 16 50 1A 2B 48 0 5D 62 6E
10 E4 C5 1D 59 5D B4 6C 1A 25 32 5F 5F 9B 1B 8F
D4 CE 94 9C E6 76 3D FC A6 45 2A DD 2F F2 8E 20
D0 69 66 1B 5E 9D F9 26 6C BC 41 12 CB 10 2F F3
6 24 7A 2D 6D F2 8D 9B BD 6C A5 6A A5 9A 68 B1
BE 7A E6 B9 12 AA 43 51 D6 20 1C C3
2 NEW Bytes:
D A
92 NEW Bytes:
B 33 4C 9A E4 94 6 2 7E 79 F4 6C 2B E4 26 65 71
B4 B9 1D 8A AA DF 77 9A AE FD 5 5F 9D 6E 18 D9
A0 ED D1 68 80 1D FE BC 11 89 21 30 D9 AB E2 83
6A D4 59 12 43 13 8 2F 57 37 35 CF 47 B3 7D 54
A1 A9 6D A8 CE A9 C2 64 8E 4B C9 F E4 D6 F8 13
54 25 89 83 6F E7 CF B4 6F 87 BB
516B were received.
Somehow, 4B were added.
Each 2 Bytes event includes "D A", but the D was not sent, just the A's, this explains the additional 4B.
My questions are:
* Why one send event is received as many events in the MCU, how can I fix it?
* Why these 4B were added?
* Why "USB_DeviceCdcAcmSend" function is needed in kUSB_DeviceCdcEventRecvResponse event? without it, just the first event is received.
Thanks
I don't know whether it helps, but "D" is CR and "A" if LF - i.e. what you will get if you printf("\n").
Thanks,
I changed the "kUSB_DeviceCdcEventRecvResponse" handler and removed the USB_DeviceCdcAcmSend part (which I think caused the "\n").
Now it looks like:
case kUSB_DeviceCdcEventRecvResponse:
{
if ((1 == g_deviceComposite_hs->cdcVcomBulk.attach) && (1 == g_deviceComposite_hs->cdcVcomBulk.startTransactions))
{
g_deviceComposite_hs->cdcVcomRecvSizeBulk = epCbParam->length;
if (!g_deviceComposite_hs->cdcVcomRecvSizeBulk)
{
/* Schedule buffer for next receive event */
error = USB_DeviceCdcAcmRecv(handle, USB_CDC_VCOM_DIC_BULK_OUT_ENDPOINT, s_currRecvBuf_BULK,
g_cdcVcomDicEndpoints_BULK[0].maxPacketSize);
}
usb_echo("%d NEW Bytes:\r\n", g_deviceComposite_hs->cdcVcomRecvSizeBulk);
for(int i = 0 ; i < g_deviceComposite_hs->cdcVcomRecvSizeBulk ; i ++ ) {
usb_echo("%X ", epCbParam->buffer[i]);
if(i % 16 == 0 && i != 0) usb_echo("\r\n");
if(i % 8 == 0 && i != 0) usb_echo(" ");
}
usb_echo("\r\n");
error = USB_DeviceCdcAcmRecv(handle, USB_CDC_VCOM_DIC_BULK_OUT_ENDPOINT, s_currRecvBuf_BULK,0);
g_deviceComposite_hs->cdcVcomRecvSizeBulk = 0;
g_deviceComposite_hs->cdcVcomSendSizeBulk = 0;
}
}
break;Now, after I send the 512B packet, I receive:
43 NEW Bytes:
65 E4 9F 40 A2 37 4F B6 D2 D0 AE 99 AC E2 A4 22 8F
99 B4 45 4A 2E A4 D1 99 22 23 E7 E0 D2 6 3D 72
92 CE AF 25 EA 7E 59 D7 56 1
0 NEW Bytes:
82 NEW Bytes:
BE 4D 91 13 B0 4B 33 62 F1 84 62 30 56 A0 2E 2A FB
7 70 E7 9A C9 64 62 2 15 19 E5 A1 F7 85 53 8B
94 D7 E7 8E B8 7E 6 C 9A 53 90 77 60 FF 9F E8
65 87 BD AD 8A 2C 70 A5 12 F9 D5 44 48 7D 47 79
D0 83 63 96 F3 D0 67 F0 4F 49 63 4A 5E 6E 10 52
3F
0 NEW Bytes:
57 NEW Bytes:
C5 CD 9E 2C C2 AA 55 9E 31 ED 6D E5 A9 2A 1F 4C 72
D2 C8 96 2 3A 8A 4A 14 9B 26 AF 99 78 FB 15 E3
52 5F 53 D1 C0 21 59 A2 0 C 6F 5B AE 15 F2 19
DC D3 81 E3 11 ED 68 90
0 NEW Bytes:
60 NEW Bytes:
18 A1 41 AD 60 B6 1F 5B 54 98 93 4 1E 0 8E E2 FC
37 9C E8 C2 99 76 A5 8B C2 F7 43 60 7A 39 17 B3
8B 20 31 2 C4 D 86 2B 5C AC 4A 1F 4E B3 7 7B
63 5F 81 AD A5 B3 EF 82 6 60 46
0 NEW Bytes:
173 NEW Bytes:
24 7B 7F 75 F5 72 D4 B0 47 55 6 F9 5F C9 9E D2 D7
BF 6F 39 9F C 37 11 35 12 4A 2C C6 8B 5A A8 A9
A5 CE BB EB E9 66 81 57 66 E2 5C F 85 D9 DE 59
1C E DF 15 E7 8 30 5D CA A7 33 7E 69 D4 39 67
18 D7 55 B3 E3 1E 9A 11 B9 1F 5E FE 98 34 FB F3
30 7F DD D9 29 DC 8C 16 50 1A 2B 48 0 5D 62 6E
10 E4 C5 1D 59 5D B4 6C 1A 25 32 5F 5F 9B 1B 8F
D4 CE 94 9C E6 76 3D FC A6 45 2A DD 2F F2 8E 20
D0 69 66 1B 5E 9D F9 26 6C BC 41 12 CB 10 2F F3
6 24 7A 2D 6D F2 8D 9B BD 6C A5 6A A5 9A 68 B1
BE 7A E6 B9 12 AA 43 51 D6 20 1C C3
0 NEW Bytes:
92 NEW Bytes:
B 33 4C 9A E4 94 6 2 7E 79 F4 6C 2B E4 26 65 71
B4 B9 1D 8A AA DF 77 9A AE FD 5 5F 9D 6E 18 D9
A0 ED D1 68 80 1D FE BC 11 89 21 30 D9 AB E2 83
6A D4 59 12 43 13 8 2F 57 37 35 CF 47 B3 7D 54
A1 A9 6D A8 CE A9 C2 64 8E 4B C9 F E4 D6 F8 13
54 25 89 83 6F E7 CF B4 6F 87 BBTotal of 507B, some data is missing.
So, you are 'missing' 5 bytes. I looked through your sent data and you have 4 'A' (LF) characters and 1 'D' (CR) characters, making 5. I wonder if something is ignoring CR and LF characters?
As en experiment, try changing the data to add more CR and LF and another with fewer CR and LF and see what that tells you.
More details:
I added a usb_echo command in the USB IRQ handler:
void USB1_IRQHandler(void)
{
usb_echo("USB Interrupt!!\r\n");
USB_DeviceLpcIp3511IsrFunction(g_composite_hs.deviceHandle);
}
When I echo data without 0x0A:
echo -n -e '\x1\x2\x3\x4\x5' > /dev/ttyACMX
The MCU's output is:
USB Interrupt!!
USB Interrupt!!
5 NEW Bytes:
1 2 3 4 5
USB Interrupt!!
If I add 0X0A to the data:
echo -n -e '\x1\x2\xa\xa\x5' > /dev/ttyACMX
USB Interrupt!!
USB Interrupt!!
3 NEW Bytes:
1 2 A
USB Interrupt!!
USB Interrupt!!
1 NEW Bytes:
A
USB Interrupt!!
USB Interrupt!!
1 NEW Bytes:
5
USB Interrupt!!
The MCU receives interrupts for every chunk, so seems that the linux driver is sending the data in chunks.
I tried to write to the port using binary mode:
fopen("/dev/ttyACMX", "wb")
But the data was chunked anyway.
Wireshark confirmed that the data is sent from my linux machine in chunks.
I think this is because tty devices are 'cooked' (internally buffered until CR/LF) - as you would expect to see on a terminal. You need to open the raw device. Take a look at this
You're right, I tried:
sudo dd if=/dev/urandom of=/dev/ttyACMX count=1
And seems that the packet is cut to different chunks every time.
Then I tried data without D or A and it was sent as 1 chunk.
Thanks for that.
I'll try to find the cause.
p.s. I notice each packet break in after a CR or LF character, so something is looking for line breaks.