diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c
index b1d1f4b96f2b1f7c2e7cdcbbd9b837fbe375d8d4..f64b79bcf985734e2bf699c5efdd72f980e426ea 100644
--- a/minichlink/minichlink.c
+++ b/minichlink/minichlink.c
@@ -23,22 +23,22 @@ void * MiniCHLinkInitAsDLL( struct MiniChlinkFunctions ** MCFO )
 	void * dev = 0;
 	if( (dev = TryInit_WCHLinkE()) )
 	{
-		fprintf( stderr, "Found WCH LinkE\n" );
+		fprintf( stderr, "Found WCH Link\n" );
 	}
 	else if( (dev = TryInit_ESP32S2CHFUN()) )
 	{
 		fprintf( stderr, "Found ESP32S2 Programmer\n" );
 	}
-    else if ((dev = TryInit_NHCLink042()))
-    {
-        fprintf( stderr, "Found NHC-Link042 Programmer\n" );
-    }
+	else if ((dev = TryInit_NHCLink042()))
+	{
+		fprintf( stderr, "Found NHC-Link042 Programmer\n" );
+	}
 	else
 	{
 		fprintf( stderr, "Error: Could not initialize any supported programmers\n" );
 		return 0;
 	}
-	
+
 	SetupAutomaticHighLevelFunctions( dev );
 	if( MCFO )
 	{
@@ -50,6 +50,10 @@ void * MiniCHLinkInitAsDLL( struct MiniChlinkFunctions ** MCFO )
 #if !defined( MINICHLINK_AS_LIBRARY ) && !defined( MINICHLINK_IMPORT )
 int main( int argc, char ** argv )
 {
+	if (argv[1][0] == '-' && argv[1][1] == 'h')
+	{
+		goto help;
+	}
 	void * dev = MiniCHLinkInitAsDLL( 0 );
 	if( !dev )
 	{
diff --git a/minichlink/pgm-wch-linke.c b/minichlink/pgm-wch-linke.c
index 6189f1e9164c8504c43a9331a03e649eb90920b5..03aa63c9b5d50e08412322e142252b09d629051b 100644
--- a/minichlink/pgm-wch-linke.c
+++ b/minichlink/pgm-wch-linke.c
@@ -197,16 +197,38 @@ static int LESetupInterface( void * d )
 	uint32_t transferred = 0;
 
 	// This puts the processor on hold to allow the debugger to run.
-	wch_link_command( dev, "\x81\x0d\x01\x03", 4, 0, 0, 0 ); // Reply: Ignored, 820d050900300500
+	wch_link_command( dev, "\x81\x0d\x01\x03", 4, (int*)&transferred, rbuff, 1024 ); // Reply: Ignored, 820d050900300500
 
 	// Place part into reset.
 	wch_link_command( dev, "\x81\x0d\x01\x01", 4, (int*)&transferred, rbuff, 1024 );	// Reply is: "\x82\x0d\x04\x02\x08\x02\x00"
+	switch(rbuff[5]) {
+		case 1:
+			fprintf(stderr, "WCH Programmer is CH549 version %d.%d\n",rbuff[3], rbuff[4]);
+			break;
+		case 2:
+			fprintf(stderr, "WCH Programmer is CH32V307 version %d.%d\n",rbuff[3], rbuff[4]);
+			break;
+		case 3:
+			fprintf(stderr, "WCH Programmer is CH32V203 version %d.%d\n",rbuff[3], rbuff[4]);
+			break;
+		case 4:
+			fprintf(stderr, "WCH Programmer is LinkB version %d.%d\n",rbuff[3], rbuff[4]);
+			break;
+		default:
+			fprintf(stderr, "Unknown WCH Programmer %02x\n", rbuff[5]);
+			return -1;
+	}
 
 	// TODO: What in the world is this?  It doesn't appear to be needed.
 	wch_link_command( dev, "\x81\x0c\x02\x09\x01", 5, 0, 0, 0 ); //Reply is: 820c0101
 
 	// This puts the processor on hold to allow the debugger to run.
-	wch_link_command( dev, "\x81\x0d\x01\x02", 4, 0, 0, 0 ); // Reply: Ignored, 820d050900300500
+	wch_link_command( dev, "\x81\x0d\x01\x02", 4, (int*)&transferred, rbuff, 1024 ); // Reply: Ignored, 820d050900300500
+	if (rbuff[0] == 0x81 && rbuff[1] == 0x55 && rbuff[2] == 0x01 && rbuff[3] == 0x01)
+	{
+		fprintf(stderr, "link error, nothing connected to linker\n");
+		return -1;
+	}
 
 	// For some reason, if we don't do this sometimes the programmer starts in a hosey mode.
 	MCF.WriteReg32( d, DMCONTROL, 0x80000001 ); // Make the debug module work properly.